生活随笔
收集整理的這篇文章主要介紹了
边工作边刷题: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 0pre_2 = nums[0]if len(nums)<2: return pre_2pre_1 = max(nums[0],nums[1])cur = pre_1for i in range(2, len(nums)):cur = max(pre_1, pre_2+nums[i])pre_2=pre_1pre_1=curreturn 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_2pre_2=curreturn pre_2if not nums: return 0if 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 = Noneclass 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,0if 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_1if not root: return 0maxValue, noUse = robRec(root)return maxValue
轉載于:https://www.cnblogs.com/absolute/p/6041360.html
總結
以上是生活随笔 為你收集整理的边工作边刷题:70天一遍leetcode: day 92 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。