代码随想录算法训练营第三十九天|leetcode198.打家劫舍、leetcode213.打家劫舍II、leetcode337.打家劫舍 III
1 leetcode198.打家劫舍
文章链接:代码随想录
视频链接:动态规划,偷不偷这个房间呢?| LeetCode:198.打家劫舍_哔哩哔哩_bilibili
思路:根据题目,我想的就是算两个隔着相加的结果,比较取大的,但是呢,感觉好像题意我理解的不是很对,反正错了
1.1 自己的代码(有误)
不知道是题目哪个地方理解不是很正确
class Solution:
def rob(self, nums: List[int]) -> int:
num1 = 0
num2 = 0
for i in range(0,len(nums),2):
num1 +=nums[i]
for j in range(1,len(nums),2):
num2 +=nums[j]
return max(num1,num2)
我在这道题里面,忘记了间隔区间必须得间隔一个,其实间隔多个也是可以的,就是这里没理解,当时就不理解为什么了
1.2 视频后的思路
还是之前的问题,我不知道如何写递推公式
class Solution:
def rob(self, nums: List[int]) -> int:
if len(nums)==1:
return nums[0]
dp = [0]*len(nums)
dp[0] = nums[0]
dp[1] = max(nums[0],nums[1])
for i in range(2,len(nums)):
dp[i] = max(dp[i-2]+nums[i],dp[i-1])
return dp[-1]
1.3 本题小结
- 怎么说呢,开始是我把这个题目想简单了,后来看了题解,一句不一定非要隔一个数才可以进行偷,就明白了自己哪儿需哦了
- 相比于之前背包问题简单一些,但是自己容易陷入背包问题的那种思路里面吧,这也是错的原因
2 leetcode213.打家劫舍II
题目链接:213. 打家劫舍 II - 力扣(LeetCode)
文章链接:代码随想录
视频链接:动态规划,房间连成环了那还偷不偷呢?| LeetCode:213.打家劫舍II_哔哩哔哩_bilibili
思路:其实就是不会,后来自己调试不断判断,知道自己是犯了什么错误,也更正过来了
2.1 视频后的方法
class Solution:
def rob(self, nums: List[int]) -> int:
if len(nums)==0:
return 0
if len(nums)==1:
return nums[0]
first = self.robsub(nums,0,len(nums)-2)
end = self.robsub(nums,1,len(nums)-1)
return max(first,end)
def robsub(self,nums,start,end):
if start==end:
return nums[start]
dp = [0]*len(nums)
dp[start] =nums[start]
dp[start+1] = max(nums[start],nums[start+1])
for i in range(start+2,end+1):
dp[i] = max(dp[i-1],dp[i-2]+nums[i])
return dp[end]
2.2 本题小结
- 这道题目就是考虑首尾两种情况分开来计算就好了,其实一直在想,我要不要在后面接一个,其实分两步就是很方便的,确实没想到
- 多建立一个函数,对我而言简单的一句话确实特别困难的行动,希望我可以慢慢养成这种思维方式吧
3 leetcode337.打家劫舍 III
题目链接:337. 打家劫舍 III - 力扣(LeetCode)
文章链接:代码随想录
视频链接:动态规划,房间连成树了,偷不偷呢?| LeetCode:337.打家劫舍3_哔哩哔哩_bilibili
思路:已经完全忘记了二叉树的知识,好迷惑的一道题目呀,对我而言,反而觉得背包问题挺适合自己的,写到这里就非常想说,小偷,做个好人吧,下次能不能别偷了,看傻了已经
3.1 视频后的思路
这道题,看完以后对我而言难的不是别的,是确定dp的含义,怎么确定,还是挺难的吧
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def rob(self, root: Optional[TreeNode]) -> int:
dp = self.traversal(root)
return max(dp)
def traversal(self,node):
if node ==None:
return (0,0)
leftdp = self.traversal(node.left)
rightdp = self.traversal(node.right)
val1 = node.val + leftdp[0]+rightdp[0]
val2 = max(leftdp[0],leftdp[1]) + max(rightdp[0],rightdp[1])
return (val2,val1)
3.2 本题小结
- 这道题目,主要的难点有两个,a.如何确定dp的含义,这个反正就是一直错错错吧;b.不知道这个dp应该是几维的数组,然后就不知道怎么写
- 好消息就是二叉树的知识还行,没有完全忘记,还能记得那么一点点吧
4 今日小结
- 这个,怎么说呢,都不是那么难,特别是1和2,第三题的问题就是出在了如何确定dp不知道怎么弄,一头污水
- 不过现在自己好像又掌握了一种方法,为自己感到庆幸

浙公网安备 33010602011771号