本文主要是介绍每日一题,力扣leetcode Hot100之198.打家劫舍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
这一道题乍一看可以双层循环暴力解,但是仔细一想有可能最大利益并不是一家隔着一家偷,我可以间隔很多家偷,所以 这个题的思路还是有点像爬楼梯,用动态规划解。
首先确立动态规划的初始条件:
1.dp[0]=nums[0]只有一家
2.dp[1]=max(nums[0],nums[1])有两家选一家多的
然后确立动态规划的循环条件:
dp[i]应该是什么
1.第i家能拿,那么dp[i]=nums[i]+dp[i-2],能拿说明上一家没拿过,那么我们就要这家的值加上dp[i-2],你也甭管上上家拿过没。
2.第i家不能拿,说明上家拿过了,那么dp[i]=dp[i-1]
那么dp[i]就取这两个其中的最大值。
class Solution:def rob(self, nums: List[int]) -> int:#如果为空列表则只能偷0元if not nums:return 0size=len(nums)#如果长度为1则只能偷一家直接返回if size==1:return nums[0]#如果长度为2则能偷两家,比两家哪个大if size==2:return max(nums[0],nums[1])#如果超过这个范围则进行dp#dp初始条件dp=[0]*sizedp[0]=nums[0]dp[1]=max(nums[0],nums[1])#dp的循环条件,从2开始一直到最后一个元素for i in range(2,size):dp[i]=max(dp[i-1],dp[i-2]+nums[i])return dp[size-1]
这篇关于每日一题,力扣leetcode Hot100之198.打家劫舍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!