问题描述:

思路描述:

典型的动态规划题,之前做过打家劫舍 I,这道题和 I 唯一的不同是房子是首尾相邻的,意思偷了第一家就不能偷最后一家,反之亦然;解决思路和打家劫舍 I也相同,维护两个变量,一个记录上一家不偷的最大收益,一个记录上一家偷的最大收益;

* 如果上一家偷了,那么这一家就不能再偷,当前的最大收益就是上一家偷了的基础上 + 0

* 如果上一家没有偷,那么这一家就可以选择偷,当前最大收益也就是 max(上一家没偷的最大收益, 上一家偷了的最大收益) + 当前这家的财产。

因为题目要求首尾住户是相邻的,于是两次动态规划,第一次传入nums[0]为0的数组(第一家不偷),第二次传入nums[nums.size()-1] 为0的数组(第一家偷),比较两次谁大就返回谁。或者也可以分别传入nums数组的 [0:num.size()-1] 和 [1:nums.size()] 来模拟第一家偷或者不偷的情况,道理都是一样。

代码实现:

class Solution {
public:int returnValue(vector<int>& nums){int lastNotThief = 0, lastDoThief = nums[0];for(int i=1; i<nums.size(); i++){int tempLastNotThief = lastNotThief;lastNotThief = max(lastNotThief, lastDoThief) + 0;lastDoThief = tempLastNotThief + nums[i];}return lastDoThief>lastNotThief?lastDoThief:lastNotThief;}int rob(vector<int>& nums) {int len = nums.size();if(len == 1) return nums[0];int temp = nums[0];nums[0] = 0;int v1 = returnValue(nums);nums[0] = temp;nums[nums.size()-1] = 0;int v2 = returnValue(nums);return v1>v2?v1:v2;}
};

Leetcode-213:打家劫舍 II相关推荐

  1. LeetCode—213. 打家劫舍 II

    213. 打家劫舍 II 题目描述:你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金.这个地方所有的房屋都围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的.同时,相邻的房屋装有相 ...

  2. leetcode - 213. 打家劫舍 II

    解题思路:这道题是"打家劫舍I"的升级版,和"打家劫舍I"的区别在于"打家劫舍II"的第一个房子和最后一个房子是相连的,这就导致不能用&qu ...

  3. [C++] LeetCode 213. 打家劫舍 II

    题目 注意事项: 这是 打家劫舍 的延伸. 在上次盗窃完一条街道之后,窃贼又转到了一个新的地方,这样他就不会引起太多注意.这一次,这个地方的所有房屋都围成一圈.这意味着第一个房子是最后一个是紧挨着的. ...

  4. LeetCode 213. 打家劫舍 II

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

  5. 103. Leetcode 213. 打家劫舍 II (动态规划-打家劫舍)

    步骤一.确定状态: 确定dp数组及下标含义 dp数组和房屋数一样大小, dp[i]表示到第i个房屋的时候, 能够偷窃到的最 高金额 步骤二.推断状态方程: 对于当前的dp[i], 有两个方向,取决于能 ...

  6. Leetcode 213. 打家劫舍 II (每日一题 20211009)

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

  7. leetcode 213. 打家劫舍 II(dp)

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

  8. LeetCode 213. 打家劫舍 II(动态规划)

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

  9. 213. 打家劫舍 II golang 动态规划

    题目 213. 打家劫舍 II 198. 打家劫舍 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金.这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的.同时,相 ...

  10. 代码随想录Day48|198.打家劫舍、213.打家劫舍II、337.打家劫舍III

    文章目录 198.打0家劫舍 213.打家劫舍II 337.打家劫舍III 198.打0家劫舍 文章讲解:代码随想录 (programmercarl.com) 题目链接:198. 打家劫舍 - 力扣( ...

最新文章

  1. spring+struts+hibernate分页 完整版,项目使用中
  2. vivado中如何导入ise工程
  3. NR 5G 零基础看5G
  4. NFS无法启动根文件系统的解决
  5. 中继承父类实现父类方法的快捷键_关于封装、继承
  6. Jquery实现图片的预加载与延时加载
  7. SQL Server 2005完全安装教程----带安装文件下载地址
  8. 小白教程 微信小程序 官方示例Demo下载及运行
  9. 如何安装.nupkg文件?
  10. 微信公众号文章上传附件怎么上传?
  11. 高中生如何才能快速提高高二数学成绩
  12. 爸妈上班却顶着凛冽的寒风骑着自行车
  13. Python报错too many values to unpack解决方案
  14. 微信小程序之一本地图片处理--按屏幕尺寸插入图片
  15. 眼球摘除手术| 作为眼科医生最无奈的手术之一,它是如何进行的?
  16. oracle的substr函数的用法
  17. R语言数据类型基础1 数值型、逻辑型与文本型
  18. 步进电机定位不准的原因及处理方法
  19. 企业路由器配置PPTP PC到站点模式Virtual Private Network指南_1(外网访问内网资源)
  20. 如何将matlab代码转为C语言(2)--在C++中调用matlab的函数

热门文章

  1. 蓝牙avrcp协议源码分析
  2. webgis之qgis缓存
  3. 树莓派之Ubuntu安装远程桌面
  4. 磁盘阵列(RAID)-很详细的介绍
  5. 用Prime95来做linux下CPU压力测试
  6. 系统定时任务linux,Linux系统管理之定时任务
  7. java 方法_Java 方法 | 菜鸟教程
  8. mysql 密码忘了_mysql8.0以上版本安装配置及忘记密码时重置
  9. matlab读取trmm,基于Matlab的TRMM3B43数据处理的思维过程与技术流程
  10. python getcwd_Python os.getcwd()方法