• 边工作边刷题:70天一遍leetcode: day 92


    House Robber I/II/III

    这题代表了单向线性dp的基本pattern: build local best value at each element and track the global optimal. 这题的要点是local是前k个房间的最优解,这个解不一定要选第k个房间。这个local解是比较k-1的optimal和k-2 optimal + current value。之所以不以必选第k个房间作local是因为有可能最优解有连续2或多个房间不选,比如100,1,1,100

    III:

    • binary tree和array的思路是一样的,对于当前root,需要前面两层的结果:left/right subtree的max和left/right的子树的max
    • 同时,和array一样,返回的值不是必然包括root的
    • 在计算left/right子树的max时,只需要sum,因为root对于两层后只关心sum
    class Solution(object):
        def rob(self, nums):
            """
            :type nums: List[int]
            :rtype: int
            """
            if not nums: return 0
            pre_2 = nums[0]
            if len(nums)<2: return pre_2
            pre_1 = max(nums[0],nums[1])
            cur = pre_1
            for i in range(2, len(nums)):
                cur = max(pre_1, pre_2+nums[i])
                pre_2=pre_1
                pre_1=cur
            
            return cur
            
    
    class Solution(object):
        def rob(self, nums):
            """
            :type nums: List[int]
            :rtype: int
            """
            def robOneDir(nums):
                pre_1 = nums[0]
                pre_2 = max(nums[0], nums[1])
                for i in range(2, len(nums)):
                    cur = max(pre_2, pre_1+nums[i])
                    pre_1=pre_2
                    pre_2=cur
                return pre_2
            
            if not nums: return 0
            if len(nums)<2: return nums[0]
            if len(nums)==2: return max(nums[0], nums[1])
            nums1,nums2=nums[0:-1],nums[1:]
            return max(robOneDir(nums1), robOneDir(nums2))
    
    # Definition for a binary tree node.
    # class TreeNode(object):
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    
    class Solution(object):
        def rob(self, root):
            """
            :type root: TreeNode
            :rtype: int
            """
            def robRec(root):
                pre_left_1,pre_left_2,pre_right_1,pre_right_2=0,0,0,0
                if root.left:
                    pre_left_1, pre_left_2 = robRec(root.left)
                    
                if root.right:
                    pre_right_1, pre_right_2 = robRec(root.right)
                    
                cur = max(pre_left_2+root.val+pre_right_2, pre_left_1+pre_right_1)
                return cur, pre_left_1+pre_right_1
                
            if not root: return 0
            maxValue, noUse = robRec(root)
            return maxValue
    
  • 相关阅读:
    Java浮点数内存存储
    Spring Cloud(一)—— 一小时了解Spring Cloud
    Java基础(三)—— 常用类
    Oracle数据库(三)—— 表(一)
    Java资源记录
    Oracle数据库(一)—— 用户与表空间(常用命令)
    Oracle数据库(二)—— 用户与表空间(错误收集)
    Java Web(一)—— html
    Hibernate框架(二)—— Hibernate的持久化类
    项目 —— spring boot博客系统(一)—— 系统简介
  • 原文地址:https://www.cnblogs.com/absolute/p/6041360.html
Copyright © 2020-2023  润新知