leetcode 213 打家劫舍II

今天药忘吃喽~ 2022-08-28 03:51 221阅读 0赞

题目

题目:213. 打家劫舍 II

参考题解:打家劫舍II-代码随想录、打家劫舍II-力扣官方题解


提交代码

我没想出来,看的答案。

在leetcode 198 打家劫舍基础上。头尾不能同时获取。

如何才能保证第一间房屋和最后一间房屋不同时偷窃呢?如果偷窃了第一间房屋,则不能偷窃最后一间房屋,因此偷窃房屋的范围是第一间房屋到最后第二间房屋;如果偷窃了最后一间房屋,则不能偷窃第一间房屋,因此偷窃房屋的范围是第二间房屋到最后一间房屋。

emm,上面的思路直觉上是对的。但是,没有经过数学证明。

  1. // 我直接用了leetcode 198的代码;本题可以不用进行数组拷贝,传递下标即可。
  2. class Solution {
  3. public:
  4. int rob_part(vector<int>& nums) {
  5. // 递推公式:dp[i] = max(dp[i-1],dp[i-2]+nums[i])
  6. // 题目限定,至少有一个元素
  7. if(nums.size() <= 2){
  8. if(nums.size() == 1)
  9. return nums[0];
  10. else if(nums.size() == 2)
  11. return max(nums[0], nums[1]);
  12. return 0;
  13. }
  14. //dp[i]表示[0,i]闭区间,能获得的最大财富
  15. vector<int> dp(nums.size(),0);
  16. dp[0] = nums[0];
  17. dp[1] = max(nums[0],nums[1]);
  18. for(int i=2; i<nums.size(); i++)
  19. dp[i] = max(dp[i-1],dp[i-2]+nums[i]);
  20. return dp[nums.size()-1];
  21. }
  22. int rob(vector<int>& nums) {
  23. if(nums.size() == 1) return nums[0];
  24. if(nums.size() == 2) return max(nums[0], nums[1]);
  25. vector<int> left_nums(nums.begin(),nums.end()-1);
  26. vector<int> right_nums(nums.begin()+1,nums.end());
  27. return max(rob_part(left_nums), rob_part(right_nums));
  28. }
  29. };

发表评论

表情:
评论列表 (有 0 条评论,221人围观)

还没有评论,来说两句吧...

相关阅读

    相关 213. 打家劫舍 II

    > 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通

    相关 leetcode213打家劫舍II

    你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系