• leetcode刷题 237~


    题目237题

    删除链表里的节点

    请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点。传入函数的唯一参数为 要被删除的节点 。

    思路

    诡异的题目

    实现

    class Solution:
        def deleteNode(self, node):
            """
            :type node: ListNode
            :rtype: void Do not return anything, modify node in-place instead.
            """
            node.val = node.next.val
            node.next = node.next.next

    题目238题

    除自身以外数组的乘积

    给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。

    示例:

    输入: [1,2,3,4]
    输出: [24,12,8,6]

    思路

    1.乘积=当前左边乘积*当前右边乘积

    实现

    1.
    class Solution:
        def productExceptSelf(self, nums: List[int]) -> List[int]:
            length = len(nums)-1
            leftout =[1]
            rightout = [1]
            result = []
            for i in range(0, length):
                temp = nums[i] * leftout[i]
                leftout.append(temp)
            for i in range(length, 0,-1):
                temp = nums[i] * rightout[length -i]
                rightout.append(temp)
            rightout = rightout[::-1]
            for i in range(length+1):
                result.append(leftout[i]*rightout[i])
            return result

    题目240题

    搜索二维矩阵II

    编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:

    每行的元素从左到右升序排列。
    每列的元素从上到下升序排列。
    示例:

    现有矩阵 matrix 如下:

    [
    [1, 4, 7, 11, 15],
    [2, 5, 8, 12, 19],
    [3, 6, 9, 16, 22],
    [10, 13, 14, 17, 24],
    [18, 21, 23, 26, 30]
    ]
    给定 target = 5,返回 true。

    给定 target = 20,返回 false。

    思路

    由于矩阵是有序的,可以将矩阵视为搜索二叉树,矩阵的右上角为根节点,左方为左子节点且小于当前节点,下方为右子节点且大于当前节点。

    实现

    class Solution:
        def searchMatrix(self, matrix, target):
            """
            :type matrix: List[List[int]]
            :type target: int
            :rtype: bool
            """
            row_len = len(matrix)
            if row_len == 0:
                return False
            col_len = len(matrix[0])
            row,col = 0, col_len-1
            while 0 <=row < row_len and 0<= col< col_len:
                if target > matrix[row][col]:
                    row += 1
                elif target < matrix[row][col]:
                    col -= 1
                else:
                    return True
            return False

    题目241题

    为运算表达式设计优先级

    给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果。你需要给出所有可能的组合的结果。有效的运算符号包含 +, - 以及 * 。

    思路

    分治的思想:

    1. 分解:按运算符分成左右两部分,分别求解
    2. 解决:实现一个递归函数,输入算式,返回算式解
    3. 合并:根据运算符合并左右两部分的解,得出最终解

    实现

    class Solution:
        def diffWaysToCompute(self, input: str) -> List[int]:
            if input.isdigit():
                return [int(input)]
            result = []
            for i,char in enumerate(input):
                if char in ["+","-","*"]:
                    left = self.diffWaysToCompute(input[:i])
                    right = self.diffWaysToCompute(input[i+1:])
                    for l in left:
                        for r in right:
                            if char == '+':
                                result.append(l + r)
                            elif char == '-':
                                result.append(l - r)
                            else:
                                result.append(l * r)
            return result

    题目242题

    有效的字母

    给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

    思路

    实现

    class Solution:
        def isAnagram(self, s: str, t: str) -> bool:
            if len(s) != len(t):
                return False
            dic = dict()
            for i in s:
                if i in dic:
                    dic[i] += 1
                else:
                    dic[i] = 1
            for i in t:
                if i in dic:
                    dic[i] -= 1
                else:
                    return False
            for i in dic.values():
                if i != 0:
                    return False
            return True

    题目257题

    二叉树的所有路径

    给定一个二叉树,返回所有从根节点到叶子节点的路径。

    思路

    二叉树的遍历

    实现

    class Solution:
        def binaryTreePaths(self, root: TreeNode) -> List[str]:
            result = []
            if not root:
                return []
            def search(node, path):
                if not node.left and not node.right:
                    result.append(path+str(node.val))
                if node.left:
                    search(node.left, path+str(node.val)+"->")
                if node.right:
                    search(node.right, path+str(node.val)+"->")
                              
            search(root,'')
            return result

    题目258题

    各位相加

    给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。

    思路实现

    1.
    class
    Solution: def addDigits(self, num: int) -> int: nums = str(num) result = num while len(nums) != 1: result = 0 for i in nums: result += int(i) nums = str(result) return result
    2.
    class Solution:
        def addDigits(self, num: int) -> int:
            if num == 0:
                return 0
            elif num%9 == 0:
                return 9
            else:
                return num%9

    题目237题

    只出现一次的数字III

    给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。

    思路实现

    class Solution:
        def singleNumber(self, nums: List[int]) -> List[int]:
            count=[]
            for num in nums:
                if num in count:
                    count.remove(num)
                else:
                    count.append(num)
            return count

    题目263题

    丑数

    编写一个程序判断给定的数是否为丑数。

    丑数就是只包含质因数 2, 3, 5 的正整数。

    思路实现

    class Solution:
        def isUgly(self, num: int) -> bool:
            if num == 0:
                return False
            while num % 2 == 0:
                num = num//2
            while num % 3 == 0:
                num = num//3
            while num % 5 == 0:
                num = num//5
            return num == 1

    题目264题

    丑数II

    编写一个程序,找出第 n 个丑数。

    丑数就是质因数只包含 2, 3, 5 的正整数。

    思路实现

    class Solution:
        def nthUglyNumber(self, n: int) -> int:
            i, j ,k = 0,0,0
            result = [1]
            while len(result) != n:
                ugly = min(result[i]*2,result[j]*3,result[k]*5)
                result.append(ugly)
                if ugly == result[i]*2:
                    i += 1
                if ugly == result[j]*3:
                    j += 1
                if ugly == result[k]*5:
                    k +=1
            return result[-1]

    题目268题

    丢失的数字

    给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。

    思路实现

    class Solution:
        def missingNumber(self, nums: List[int]) -> int:
            n = len(nums)
            sum1 =  sum(nums)
            sum2 = (1+n)*n/2
            return int(sum2-sum1)

    题目237题

    H指数

    给定一位研究者论文被引用次数的数组(被引用次数是非负整数)。编写一个方法,计算出研究者的 h 指数。

    h 指数的定义:h 代表“高引用次数”(high citations),一名科研人员的 h 指数是指他(她)的 (N 篇论文中)总共有 h 篇论文分别被引用了至少 h 次。(其余的 N - h 篇论文每篇被引用次数 不超过 h 次。)

    例如:某人的 h 指数是 20,这表示他已发表的论文中,每篇被引用了至少 20 次的论文总共有 20 篇。

    思路实现

    class Solution:
        def hIndex(self, citations: List[int]) -> int:
            citations.sort()
            citations.reverse()
            i = 0
            while i < len(citations) and citations[i] > i:
                i += 1
            return i

    题目237题

    H指数II

    思路

    二分法

    实现

    题目278题

    第一个错误版本

    你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。

    假设你有 n 个版本 [1, 2, ..., n],你想找出导致之后所有版本出错的第一个错误的版本。

    你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。

    思路

    二分法

    实现

    class Solution:
        def firstBadVersion(self, n):
            """
            :type n: int
            :rtype: int
            """
            left = 1
            right = n
            while left <= right:
                mid = left + (right-left)//2
                if isBadVersion(mid):
                    right = mid - 1
                else:      
                    left = mid + 1
            return left

    题目279题

    完全平方数

    给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。

    示例 1:

    输入: n = 12
    输出: 3
    解释: 12 = 4 + 4 + 4.

    思路

    1.递归:

    numSquares(n)=min(numSquares(n-k) + 1),其中k是完全平方数

    由此完成的算法时间超时遇到n=44无法通过,于是增加优化,去除重复,new_k <= pre_k,遇到n=165超时

    2.动态规划

    numSquares(n)=min(numSquares(n-k) + 1)

    3.贪心算法

    假设一个数可以组成,若不行两个数组成,以此类推

    实现

    1.
    class Solution:
        def numSquares(self, n: int) -> int:
            result = float("inf")
    
            def square(n, pre):
                if n == 0:
                    nonlocal result
                    result = min(result,len(pre))
                elif n < 0:
                    return
                first = int(n**0.5)
                visit = pre[-1] if len(pre) > 0 else first
                while first > 0 and first <= visit:
                    num = first**2
                    square(n-num, pre +[num])
                    first -= 1
            
            square(n,[])
            return result
    2.
    class Solution:
        def numSquares(self, n: int) -> int:
            square_nums = [i**2 for i in range(0, int(math.sqrt(n))+1)]
            res = [float('inf') for _ in range(n+1)]
            res[0] = 0
            for i in range(1, n+1):
                for square in square_nums:
                    if i < square:
                        break
                    res[i] = min(res[i], res[i-square]+1)
            return res[-1]
    3.
    class Solution:
        def numSquares(self, n: int) -> int:
            square_nums = [i**2 for i in range(0, int(math.sqrt(n))+1)]
            
            def is_square(n,count):
                if count == 1:
                    return n in square_nums
                for k in square_nums:
                    if is_square(n - k, count - 1):
                        return True
                return False

            for i in range(1, n+1):
                if is_square(n,i):
                    return i

    题目283题

    移动零

    给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

    思路

    双指针,一个指向当前,另一个指向非零

    实现

    class Solution:
        def moveZeroes(self, nums: List[int]) -> None:
            """
            Do not return anything, modify nums in-place instead.
            """
            notzero = 0
            for cur in range(len(nums)):
                if nums[cur] != 0:
                    nums[cur],nums[notzero] = nums[notzero], nums[cur]
                    notzero += 1

    题目284题

    顶端迭代器

    给定一个迭代器类的接口,接口包含两个方法: next() 和 hasNext()。设计并实现一个支持 peek() 操作的顶端迭代器 -- 其本质就是把原本应由 next() 方法返回的元素 peek() 出来。

    思路

    实现

    class PeekingIterator:
        def __init__(self, iterator):
            """
            Initialize your data structure here.
            :type iterator: Iterator
            """
            self.container = []
            while iterator.hasNext():
                self.container.append(iterator.next())
            self.left = 0
    
        def peek(self):
            """
            Returns the next element in the iteration without advancing the iterator.
            :rtype: int
            """
            return self.container[self.left]
    
            
    
        def next(self):
            """
            :rtype: int
            """
            self.left += 1
            return self.container[self.left-1]
            
    
        def hasNext(self):
            """
            :rtype: bool
            """
            return not self.left == len(self.container)

    题目287题

    寻找重复数

    给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。

    思路

    二分法

    实现

    class Solution:
        def findDuplicate(self, nums: List[int]) -> int:
            size = len(nums)
            left, right = 1, size-1
            while left < right:
                mid = left + (right-left)//2
                cout = 0
                for num in nums:
                    if num <= mid:
                        cout += 1
                if cout > mid:
                    right = mid
                else:
                    left = mid+1
            return left

    题目237题

    思路实现

    题目237题

    思路实现

    题目237题

    思路实现

    题目237题

    思路实现

    题目237题

    思路实现

    题目237题

    思路实现

    题目237题

    思路实现

    题目237题

    思路实现

    题目237题

    思路实现 

    题目237题

    思路实现

    题目237题

    思路实现

    题目237题

    思路实现

  • 相关阅读:
    10-02 青蛙跳台阶(斐波那契数列的应用)
    10-01 斐波那契数列
    08 二叉树的下一个节点
    07 重建二叉树
    Java中如何调用静态方法
    Java中如何调用静态方法
    Java方法调用数组,是否改变原数组元素的总结
    Java方法调用数组,是否改变原数组元素的总结
    JAVA中,一个类中,方法加不加static的区别,
    JAVA中,一个类中,方法加不加static的区别,
  • 原文地址:https://www.cnblogs.com/mgdzy/p/13840713.html
Copyright © 2020-2023  润新知