美文网首页
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