Leetcode第五天动态规划 (打家劫舍 股票抛售) python
创始人
2025-05-31 23:57:25
0

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/house-robber-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

213 打家劫舍 II
你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。

给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。

class Solution:def rob(self, nums: List[int]) -> int:#当偷窃的人家超过两家 则要考虑#考虑到情况1首位相连 当偷了第一家时,最后一家不能偷窃#情况2 当偷了最后一家时 第一家不能偷窃#dp[i] 表示第i次可以偷取的最高金额#dp[i] 递推公式dp[i]=max(dp[i-1],dp[i-2]+nums[i])if len(nums)<=2:return max(nums)else:nums_1=nums[0:-1]nums_2=nums[1:]dp_1=[0]*(len(nums_1))dp_1[0]=nums_1[0]dp_1[1]=max(nums_1[0],nums_1[1])dp_2=[0]*(len(nums_2))dp_2[0]=nums_2[0]dp_2[1]=max(nums_2[0],nums_2[1])for i in range(2,len(nums_1)):dp_1[i]=max(dp_1[i-1],dp_1[i-2]+nums_1[i])for j in range(2,len(nums_2)):dp_2[j]=max(dp_2[j-1],dp_2[j-2]+nums_2[j])return max(dp_1[-1],dp_2[-1])

337 打家劫舍III
小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 root 。

除了 root 之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果 两个直接相连的房子在同一天晚上被打劫 ,房屋将自动报警。

给定二叉树的 root 。返回 在不触动警报的情况下 ,小偷能够盗取的最高金额 。
错误代码
我一开始想的是小偷只能偷某一层但是其实偷相邻层的同一边的孩子也不是直接相邻的,不会触发警报,思考错误

# 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[i] 为偷到第i层能窃取的最大金额#只能一层一层的偷#dp[i]=max(dp[i-1],dp[i-2]+sum(val))#遍历顺序 层次遍历dp=[0]*(100)dp[0]=root.valif not root.left and not root.right:return root.valque=[]sum_=0que.append(root.left)que.append(root.right)if root.left:sum_=sum_+root.left.valif root.right:sum_=sum_+root.right.valdp[1]=max(dp[0],sum_)for i in range(2,100):sum_=0flag=2**i#while(que)for j in range(0,flag):chi=que.pop(0)if chi:que.append(chi.left)que.append(chi.right)if chi.left:sum_=sum_+chi.left.valif chi.right:sum_=sum_+chi.right.valelse:que.append(TreeNode(0))que.append(TreeNode(0))# print(sum_)dp[i]=max(dp[i-1],dp[i-2]+sum_)if que:breakprint(dp)return dp[i]

正确代码

        #dp[i][0] 不偷节点i可以得到的最大值金额#dp[i][1]表示偷该节点可以得到的最大值金额#通过后序遍历树可以满足递归关系 如果抢了该节点,其孩子就不要动#如果没有偷该节点,可以考虑一下偷取孩子节点的金额#递归关系 父母dp[i][0]=max(dp[left][1],dp[left][1])+max(dp[right][1],dp[right][1])#   dp[i][1]=父母节点的val+dp[left][0]+dp[right][0]def tree(cur):if not cur:return 0,0left_tou,left_no=tree(cur.left)right_tou,right_no=tree(cur.right)val1=cur.val+left_no+right_noval2=max(left_tou,left_no)+max(right_tou,right_no)return val1,val2return max(tree(root))

121 买卖股票
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。

返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

class Solution:def maxProfit(self, prices: List[int]) -> int:#dp[i][0]表示第i天持有股票的最大现金 dp[i][0]表示第i天不持有股票的现金#递推关系 dp[i][0]=max(dp[i-1][0],-price[i])#dp[i][1]=max(dp[i-1][1],dp[i-1][0]+price[i])#初始化dp[0][0]=-price dp[0][1]=0dp=[[0]*2 for _ in range (len(prices))]dp[0][0]=-prices[0] dp[0][1]=0for i in range(1,len(prices)):dp[i][0]=max(dp[i-1][0],-prices[i])dp[i][1]=max(dp[i-1][1],dp[i-1][0]+prices[i])return dp[-1][1]

相关内容

热门资讯

安卓9系统怎样应用分身,轻松实... 你有没有发现,手机里的APP越来越多,有时候一个APP里还要处理好多任务,分身功能简直就是救星啊!今...
获取安卓系统的ip地址,轻松获... 你有没有想过,你的安卓手机里隐藏着一个神秘的IP地址?没错,就是那个能让你在网络世界里找到自己的小秘...
LG彩电安卓系统升级,畅享智能... 你家的LG彩电是不是最近有点儿“闹别扭”,屏幕上时不时地跳出个升级提示?别急,今天就来给你详细说说这...
阴阳师安卓苹果系统,安卓与苹果... 亲爱的玩家们,你是否曾在深夜里,手握手机,沉浸在阴阳师的神秘世界?今天,就让我带你一起探索这款风靡全...
华为安卓系统区别在哪,独特创新... 你知道吗?最近手机圈里可是热闹非凡,尤其是华为的新动作,让很多人眼睛都瞪大了。没错,我说的就是华为自...
怎么重新刷安卓手机系统,深度解... 手机用久了,是不是感觉卡顿得厉害?别急,今天就来教你怎么重新刷安卓手机系统,让你的手机焕然一新,速度...
刷正版安卓系统教程,刷正版安卓... 你有没有想过,让你的安卓手机焕然一新,体验一把正版系统的魅力呢?别急,今天就来手把手教你如何刷正版安...
移动支撑系统安卓版,助力移动办... 你有没有发现,现在的生活越来越离不开手机了?无论是工作还是娱乐,手机几乎成了我们生活的必需品。而今天...
安卓怎么进win系统界面,安卓... 亲爱的安卓用户,你是否曾幻想过在安卓设备上直接体验Windows系统的魅力?别再羡慕那些Window...
incall可以升级安卓系统吗... 你有没有想过,你的手机是不是也能像电脑一样,时不时地来个系统升级呢?今天,咱们就来聊聊这个话题——i...
安卓系统带农历软件,尽享传统节... 你知道吗?现在智能手机上有个特别实用的功能,那就是农历显示。对于咱们中国人来说,农历可是有着深厚的历...
安卓系统资源占用高,揭秘原因与... 你有没有发现,你的安卓手机最近变得越来越慢了?是不是觉得打开一个应用都要等半天,甚至有时候还会卡死?...
安卓10的系统有哪些,功能升级... 你有没有发现,你的安卓手机最近是不是变得有点不一样了?没错,就是那个神秘的安卓10系统!它就像一位魔...
固态硬盘系统迁移到安卓,固态硬... 你有没有想过,把你的固态硬盘系统迁移到安卓设备上,是不是能让你在移动办公或者娱乐时更加得心应手呢?想...
平板电脑能玩安卓系统吗,畅享丰... 你有没有想过,平板电脑竟然也能玩安卓系统?这可不是天方夜谭,而是科技发展的新趋势。想象你手中的平板瞬...
安卓刷精简系统下载,轻松打造高... 你有没有想过,你的安卓手机是不是有点儿“臃肿”了呢?运行速度慢,电池续航短,有时候还卡得要命。别急,...
安卓子系统windows11,... 你知道吗?最近科技圈可是炸开了锅,因为安卓子系统在Windows 11上的兼容性成了大家热议的话题。...
电脑里怎么下载安卓系统,电脑端... 你有没有想过,你的电脑里也能装上安卓系统呢?没错,就是那个让你手机不离手的安卓!今天,就让我来带你一...
索尼相机魔改安卓系统,魔改系统... 你知道吗?最近在摄影圈里掀起了一股热潮,那就是索尼相机魔改安卓系统。这可不是一般的改装,而是让这些专...
安卓系统哪家的最流畅,安卓系统... 你有没有想过,为什么你的手机有时候像蜗牛一样慢吞吞的,而别人的手机却能像风一样快?这背后,其实就是安...