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

2020-2-15 刷题记录

作者: madao756 | 来源:发表于2020-02-16 00:46 被阅读0次

    以后把每天做的题做个简单的记录,方便后面总结

    0X00 leetcode 做了六道

    • 二叉树中的最大路径和 (124)
    • 在二叉树中分配硬币 (979)
    • 搜索插入位置 (35)
    • 在排序数组中查找元素的第一个和最后一个位置(34)
    • 基于时间的键值存储(981)
    • 二分查找(704)

    0X01 每道题的小小记录

    二叉树中的最大路径和 (124)

    class Solution:
        def maxPathSum(self, root: TreeNode) -> int:
            self.ans = float('-Infinity')
            def postorder(root):
                if root is None: return 0
                l = max(0, postorder(root.left))
                r = max(0, postorder(root.right))
                self.ans = max(l+r+root.val, self.ans)
                return max(l, r) + root.val
            
            postorder(root)
            return self.ans
    

    hard 题关键在于理解题目:

    • 一段最长路径必须包括子树的根节点

    • 但最长路径不需要一定包含整棵树的根节点

    所以我们应该自底向上记录最长路径,而不是去取包含根节点的最长路径

    在二叉树中分配硬币 (979)

    
    class Solution:
        def distributeCoins(self, root: TreeNode) -> int:
            self.ans = 0
            def postorder(root):
                if root is None:return 0
                l = postorder(root.left)
                r = postorder(root.right)
                self.ans += abs(l) + abs(r)
                return l + r + root.val - 1
            postorder(root)
            return self.ans
    

    中等难度,这道题也是自底向上,后续遍历

    关键在于理解:让父节点去处理子节点的硬币分配,但是要子节点去告诉父节点,需要怎么分配

    搜索插入位置 (35)

    class Solution:
        def searchInsert(self, nums: List[int], target: int) -> int:
            left, right = 0, len(nums) - 1
            while left <= right:
                mid = left + (right - left) // 2
                if nums[mid] == target: return mid
                elif nums[mid] > target: right = mid - 1
                else: left = mid + 1
            return left
    

    简单难度,这是一道模板题目,要永远记住这个模板.其中 left 就是最后的插入位置

    且 left 的范围是 [0, len]

    在排序数组中查找元素的第一个和最后一个位置(34)

    class Solution:
        def searchRange(self, nums: List[int], target: int) -> List[int]:
            left, right = 0, len(nums) - 1
            idx = -1
            while left <= right:
                mid = left + (right - left) // 2
                if nums[mid] == target:
                    idx = mid
                    break
                elif nums[mid] > target: right = mid - 1
                else: left = mid + 1
            
            if idx == -1:
                return [-1, -1]
            
            left = right = idx
            while right < len(nums) and nums[right] == target:
                right += 1
            right -= 1
    
            while left > -1 and nums[left] == target:
                left -= 1
            left += 1
            
            return [left, right]
    

    35 模板改的

    基于时间的键值存储(981)

    class TimeMap:
    
        def __init__(self):
            """
            Initialize your data structure here.
            """
            self.Map = {}
            
    
        def set(self, key: str, value: str, timestamp: int) -> None:
            if key not in self.Map:
                self.Map[key] = [(timestamp, value)]
            else:
                self.Map[key].append((timestamp, value))
            
        def get(self, key: str, timestamp: int) -> str:
            if key not in self.Map: return ""
            values = self.Map[key]
            left, right = 0, len(values) - 1
    
            while left <= right:
                mid = left + (right - left) // 2
                if timestamp == values[mid][0]:
                    return values[mid][1]
                elif timestamp > values[mid][0]: left = mid + 1
                else: right = mid - 1
    
            if left > 0: return  values[left-1][1]
            return ""
    

    根据 35 模板改的

    二分查找(704)

    class Solution:
        def search(self, nums: List[int], target: int) -> int:
    
            left, right = 0, len(nums) - 1
            while left <= right:
                mid =  left + (right - left) // 2
                if nums[mid] == target: return mid
                elif nums[mid] > target: right = mid - 1
                else: left = mid + 1
    
            return -1 
    

    35 模板改的

    相关文章

      网友评论

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

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