美文网首页
2020-2-19 刷题记录

2020-2-19 刷题记录

作者: madao756 | 来源:发表于2020-02-19 23:58 被阅读0次

    0X00 leetcode 做了 6 道

    • Leetcode 501. Find Mode in Binary Search Tree
    • Leetcode 746. Min Cost Climbing Stairs
    • Leetcode 1137. N-th Tribonacci Number
    • Leetcode 303. Range Sum Query - Immutable
    • Leetcode 1218. Longest Arithmetic Subsequence of Given Difference
    • Leetcode 53. Maximum Subarray

    0X01 每道题的小小总结

    首先今天难题做的不多,大多数是简单题,算是开了 DP 的坑了

    501. Find Mode in Binary Search Tree

    这道题...虽然看着我用 inorder 去做的,但是和 inorder 并没有多大关系 水过

    class Solution:
        def findMode(self, root: TreeNode) -> List[int]:
            self.recoder = {}
            self.max = 1
    
            def inorder(root):
                if root is None: return
                inorder(root.left)
                if root.val not in self.recoder:
                    self.recoder[root.val] =  1
                else:
                    self.recoder[root.val] += 1
                    self.max = max(self.recoder[root.val], self.max)
                inorder(root.right)
    
            inorder(root)
    
            ans = []
    
            for k in self.recoder.keys():
                if self.recoder[k] == self.max:
                    ans.append(k)
            return ans
    

    746. Min Cost Climbing Stairs

    开动态规划的坑了,花花的动态规划的题目还是很多的,好好做

    这个上楼梯的问题

    dp(n) = min(dp(n-1), dp(n-2)) + cost

    但是这个题的最后一层没有花费所以直接返回 min(dp(n-1), dp(n-2)) 而且是自底向上

    class Solution:
        def minCostClimbingStairs(self, cost: List[int]) -> int:
            # 自底向上
            # 写出 dp 公式
            # dp(n) = min(dp(n-1), dp(n-2)) + cost[n]
    
            dp1 = cost[0]
            dp2 = cost[1]
    
            for i in range(2, len(cost), 1):
                dp_n = min(dp1, dp2) + cost[i]
                dp1, dp2 = dp2, dp_n
            
            return min(dp1, dp2)
    

    1137. N-th Tribonacci Number

    这个题就更简单了...直接写出

    T(n) = T(n-1) + T(n-2) + T(n-3)

    class Solution:
        def tribonacci(self, n: int) -> int:
            memory = [0, 1, 1]
            if n < 3:
                return memory[n]
            
            ans = 0
            for i in range(3, n+1):
                t = sum(memory)
                memory[0], memory[1], memory[2] = memory[1], memory[2], t 
            
            return memory[2]
    

    303. Range Sum Query - Immutable

    这道题还是很有意思的,我已开始以为是「线段树」但是看了解答觉得解答还是非常的牛逼的

    其实就用到一条

    sum[i, j] = sum[j] - sum[i-1] (i > 0)

    class NumArray:
    
        def __init__(self, nums: List[int]):
            if len(nums) <= 0: return
            self.sums = [x for x in nums]
    
            for i in range(1, len(nums)):
                self.sums[i] = self.sums[i-1] + nums[i] 
    
    
        def sumRange(self, i: int, j: int) -> int:
            if i == 0:
                return self.sums[j]
            return self.sums[j] - self.sums[i-1]
    

    1218. Longest Arithmetic Subsequence of Given Difference

    这道题也很牛逼,,,以为我完全不会做...看了解答觉得很巧妙,

    像这种在序列中找等差数列的这类题应该都是「这种模板」

    class Solution:
        def longestSubsequence(self, arr: List[int], difference: int) -> int:
            visited = {}
            for i in arr:
                if i - difference in visited:
                    visited[i] = visited[i - difference] + 1
                else:
                    visited[i] = 1
            return max(visited.values())
    

    53. Maximum Subarray

    这道题用动态规划做还是很巧秒的,从 0 开始遍历寻找不超过每个元素的最大子串

    • 如果上一次的子串和小于 0 那么我肯定不加上一位的 这一位的最大就是自己
    • 反之就加上

    很巧妙

    class Solution:
        def maxSubArray(self, nums: List[int]) -> int:
            # 包括自己的最大子串
            f = [x for x in nums]
    
            for i in range(1, len(f)):
                f[i] = f[i] if f[i-1] < 0 else f[i] + f[i-1]
    
            return max(f)
    

    明天继续做「动态规划」,加油!

    相关文章

      网友评论

          本文标题:2020-2-19 刷题记录

          本文链接:https://www.haomeiwen.com/subject/qcctqhtx.html