目录

  • 1、题目
  • 2、求解思路
  • 3、代码

1、题目

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

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

2、求解思路

1、确定总目标:从0~nums.size()-1个房子中能偷到的最大金额
2、确定子问题:从 0~k 个房子中能偷到的最大金额,k=nums.size()-1就是原问题。(原问题要能由子问题表示。)
3、分析状态方程:一个子问题的解要能通过其他子问题的解求出。
对于每个房屋,我们有两种选择:偷或者不偷;
如果选择偷第i个房屋,那么第i-1个房屋肯定不能偷,问题转化为前i-2个房屋中最大价值,最后再加上第i个房屋的价值,构成第前i个房屋中最大价值。
如果选择不偷第i个房屋,那么第i-1个房屋肯定能偷,问题转化为前i-1个房屋中最大价值,构成第前i个房屋中最大价值。
所以状态方程确定:

dp[i]=max(dp[i-1],dp[i-2]+nums[i]);

4、边界条件:
当只有一个房屋时,一定偷这个房屋。
当只有两个房屋时,选择偷两个中价值较大的房屋。
5、空间优化
对于小偷问题,我们发现,最后一步计算 dp[i]的时候,实际上只用到了dp[i-1] 和 dp[i-2] 的结果。
那么,我们可以只用两个变量保存两个子问题的结果,就可以依次计算出所有的子问题。

int ScrollingArray[2]=0;
//循环开始时,ScrollingArray[1]表示 dp[i-1],ScrollingArray[0]表示 dp[i-2]
for(int i=2;i<size;i++)
{//dp[i] = max{ dp[i-1], dp[i-2] + nums[i] }int temp = max(ScrollingArray[1],ScrollingArray[0]+nums[i]);//dp[i-2] = dp[i-1];ScrollingArray[0]=ScrollingArray[1];//dp[i-1]=dp[i]ScrollingArray[1] = temp;
}

3、代码

1、没有滚动数组优化:

class Solution {public:int rob(vector<int>& nums) {int size = nums.size();if(size==0) return 0;else if(size == 1) return nums[0];else if(size == 2) return max(nums[1],nums[0]);vector<int >dp(size,0);dp[0]=nums[0];dp[1]=max(nums[1],nums[0]);//对于每一个房间,有不偷和偷两种结果,我们取价值最大的。for(int i=2;i<size;i++) dp[i]=max(dp[i-1],dp[i-2]+nums[i]);return dp[size-1];}
};

2、加了滚动数组优化;

class Solution {public:int rob(vector<int>& nums) {int size = nums.size();if(size==0) return 0;else if(size == 1) return nums[0];else if(size == 2) return max(nums[1],nums[0]);int ScrollingArray[2]={0};ScrollingArray[0]=nums[0];ScrollingArray[1]=max(nums[1],nums[0]);//循环开始时,ScrollingArray[1]表示 dp[i-1],ScrollingArray[0]表示 dp[i-2]for(int i=2;i<size;i++) {//dp[i] = max{ dp[i-1], dp[i-2] + nums[i] }int temp = max(ScrollingArray[1],ScrollingArray[0]+nums[i]);//dp[i-2] = dp[i-1];ScrollingArray[0]=ScrollingArray[1];//dp[i-1]=dp[i]ScrollingArray[1] = temp;}return ScrollingArray[1];}
};

leetcode 198. 打家劫舍 思考分析相关推荐

  1. leetcode 198打家劫舍

    leetcode 198打家劫舍 题目链接:打家劫舍 题目描述:你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间 ...

  2. leetcode - 198. 打家劫舍

    198. 打家劫舍 -------------------------------------- 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房 ...

  3. leetcode 78. 子集 思考分析

    题目 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 思考分析 画出解空间树. 我们可以发现我们所需要的结果是解空间的所有结点.而我们之前 ...

  4. LeetCode 198. 打家劫舍(DP)

    1. 题目 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警. 给 ...

  5. LeetCode 110. 平衡二叉树思考分析

    题目 给定一个二叉树,判断它是否是高度平衡的二叉树. 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1. 示例 1: 给定二叉树 [3,9,20,null ...

  6. leetcode 46. 全排列 思考分析

    目录 1.题目 2.思考 3.优化 1.题目 给定一个 没有重复 数字的序列,返回其所有可能的全排列. 2.思考 老规矩,先画出给出的例子的解空间树: 观察我们可以发现: 1.深度向下一层深入时,出现 ...

  7. 102. Leetcode 198. 打家劫舍 (动态规划-打家劫舍)

    步骤一.确定状态: 1.确定原问题中变化的变量个数 2.考虑最后一步: 对于第N间房屋,有两个选项: 偷窃第N间房屋,那么就不能偷窃第N−1间房屋,偷窃总金额为前N-2间房屋的最高总金额与第N间房屋的 ...

  8. Leetcode 198.打家劫舍 (每日一题 20210622)

    你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警.给定一个代表每个 ...

  9. leetcode 198. 打家劫舍(最简单的动态规划问题)

    题目 思路 经典的动态规划问题 第 i 家:偷,或者不偷 -- 从这两种选择中,选择最大值. 1.如果 不偷,则等于 前 i-1 家最大 2.如果 偷,则等于 前 i-2 家最大 + 第 i 家 题解 ...

最新文章

  1. Leangoo 6.2.7 版发布
  2. pip 20.3 新版本发布!即将抛弃 Python 2.x
  3. 让echo解析反斜杠
  4. Android使用Intent实现拨打电话的动作
  5. 感染新冠后为啥会丧失​嗅觉?最新《细胞》论文终于搞明白了!
  6. 【codevs1078】最小生成树,prim算法
  7. (转)KeyDown、KeyUp、KeyPress区别
  8. oracle 批量更新_用集算器更新数据库的技巧
  9. 【语法】iOS(一)ObjectC的语法
  10. Shelld5的使用
  11. Oracle JOB的建立,定时执行任务
  12. hadoop入门-centos7.2安装hadoop2.8
  13. (第八天)记忆系统训练软件3.0
  14. 弹性系数和线径的计算公式_弹簧弹力计算公式详解
  15. http-server 简介
  16. Redis5.0集群搭建(三主三从)、添加一主一从、JedisCluster连接集群
  17. SQL Server“对象名无效”报错的解决方法
  18. 基于AIC评价指标的逐步回归Python语言实现
  19. docfx 做一个和微软一样的文档平台
  20. SQL Server 方言类型映射问题

热门文章

  1. 全字符微信名 php,PHP方法处理微信昵称特殊符号过滤
  2. 便携式不锈钢管道焊接机器人_304不锈钢管居然可以发黑?
  3. 计算机考研数学基础知识点,2019计算机考研数学复习:打好基础是必须的啊喂!...
  4. matlab ode45 二阶微分,matlab关于ode45解二阶微分方程的困惑
  5. 组态王怎么做超级曲线_鸭肉怎么做?大叔教你红烧鸭块,香气扑鼻,简单易做,超级好吃...
  6. linux eclipse svn插件安装,Linux上Eclipse安装SVN插件和安装JavaHL
  7. 详细介绍jQuery.outerWidth() 函数具体用法
  8. yearProgress.vue
  9. 2.2 .this的绑定规则
  10. 添加jQuery方法解析url查询部分