【LeetCode】198.打家劫舍
题目
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。
题解
方法一:动态规划(递归实现)
算法
解这道题的思路采用动态规划的思想
设第iii个房屋的现金为AiA_iAi,有nnn个房屋时能够偷窃到的最高金额为f(n)f(n)f(n),则:
- 如果有一户人家,那答案就是本身,即 A0A_0A0
- 如果有两户人家,那就是 max(A0,A1)max(A_0, A_1)max(A0,A1)
- 如果有三户人家,则为 max(A0+A2,A1)max(A_0+A_2, A_1)max(A0+A2,A1)
由此可以归纳出:
f(n)=max(f(n−2)+An,f(n−1))f(n)=max(f(n-2)+A_n,f(n-1))f(n)=max(f(n−2)+An,f(n−1))
从上式可以看出符合动态规划的全局最优解蕴含在局部最优解的思想
实现算法的时候可以参照斐波那契数列的递归实现方法,也是最简单能想到的一个方法
代码
class Solution {public:int rob(vector<int>& nums) {if (nums.size() == 0)return 0;return Rob(nums, nums.size() - 1);}int Rob(vector<int>& nums, int n) {if (n == 0)return nums[0];else if (n == 1)return nums[0] > nums[1] ? nums[0] : nums[1];int a = Rob(nums, n - 2) + nums[n];int b = Rob(nums, n - 1);return a > b ? a : b;}
};
分析
简单递归实现大量重复计算底层元素
- 时间复杂度:O(2n)O(2^n)O(2n)
- 空间复杂度:O(n)O(n)O(n),递归树的深度可以达到nnn
- LeetCode排名:超时
方法二:动态规划(数组实现)
算法
算法思路也是动态规划:
f(n)=max(f(n−2)+An,f(n−1))f(n)=max(f(n-2)+A_n,f(n-1))f(n)=max(f(n−2)+An,f(n−1))
不过实现的时候没有使用递归,而是从前往后将每次的最优解都存在数组里
代码
class Solution {public:int rob(vector<int>& nums) {int n = nums.size();if(n == 0)return 0;else if (n == 1)return nums[0];else if (n == 2)return nums[0] > nums[1] ? nums[0] : nums[1];int* dp = new int[n];dp[0] = nums[0];dp[1] = nums[0] > nums[1] ? nums[0] : nums[1];for (int i = 2; i < n; i++) {int a = dp[i - 2] + nums[i];int b = dp[i - 1];dp[i] = a > b ? a : b;}return dp[n - 1];}
};
分析
- 时间复杂度:O(n)O(n)O(n),一次遍历即可
- 空间复杂度:O(n)O(n)O(n),创建了n大小的空间
- LeetCode排名:4ms4ms4ms
方法三:动态规划(常数空间)
算法
算法思路也是动态规划:
f(n)=max(f(n−2)+An,f(n−1))f(n)=max(f(n-2)+A_n,f(n-1))f(n)=max(f(n−2)+An,f(n−1))
可以注意到,计算第iii个最优解f(i)f(i)f(i)时,只需要f(i−2)f(i-2)f(i−2)和f(i−1)f(i-1)f(i−1),故可以对上面的算法进行改进
存储上摒弃了新开辟线性空间的做法,而是只用了两个变量来存储这两个最优解
代码
class Solution {public:int rob(vector<int>& nums) {if(nums.size() == 0)return 0;int pre = 0, cur = 0; //previous and current maximum resultfor (const auto& i : nums) {int t = cur;cur = cur > pre + i ? cur : pre + i;pre = t;}return cur;}
};
分析
- 时间复杂度:O(n)O(n)O(n)
- 空间复杂度:O(1)O(1)O(1),只用常数空间
- LeetCode排名:0ms0ms0ms,有时跳到4ms4ms4ms
【LeetCode】198.打家劫舍相关推荐
- leetcode 198打家劫舍
leetcode 198打家劫舍 题目链接:打家劫舍 题目描述:你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间 ...
- leetcode - 198. 打家劫舍
198. 打家劫舍 -------------------------------------- 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房 ...
- LeetCode 198. 打家劫舍(DP)
1. 题目 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警. 给 ...
- 102. Leetcode 198. 打家劫舍 (动态规划-打家劫舍)
步骤一.确定状态: 1.确定原问题中变化的变量个数 2.考虑最后一步: 对于第N间房屋,有两个选项: 偷窃第N间房屋,那么就不能偷窃第N−1间房屋,偷窃总金额为前N-2间房屋的最高总金额与第N间房屋的 ...
- Leetcode 198.打家劫舍 (每日一题 20210622)
你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警.给定一个代表每个 ...
- leetcode 198. 打家劫舍(最简单的动态规划问题)
题目 思路 经典的动态规划问题 第 i 家:偷,或者不偷 -- 从这两种选择中,选择最大值. 1.如果 不偷,则等于 前 i-1 家最大 2.如果 偷,则等于 前 i-2 家最大 + 第 i 家 题解 ...
- [leetcode] 198.打家劫舍
你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警. 给定一个代表每 ...
- leetcode 198. 打家劫舍 思考分析
目录 1.题目 2.求解思路 3.代码 1.题目 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同 ...
- LeetCode 198 打家劫舍
题目描述 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻 的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警.给定 ...
- LeetCode 198. 打家劫舍(动态规划)
题目描述 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警. 给定 ...
最新文章
- 京东到家甩包袱给达达 路走错了合并也没
- 漫画 | 如何用 Kubernetes 实现 CI/CD 发布流程?
- centos导出mysql数据库_centos5.8系统下MySQL数据库导出与导入操作
- 650c公路车推荐_众望所归 多款短鼻公路车坐垫推荐
- SecureCRT 或者 超级终端 始终无法ping通主机
- servlet需要和ajax,如何使用Servlet和Ajax?
- 自动驾驶安全驾驶规则_自动驾驶知识科普 自动驾驶汽车的七大核心技术
- 一种单独适配于NER的数据增强方法:DAGA
- js排序的时间复杂度_冒泡排序最好时间复杂度为什么是O
- Android笔记 解析xml文件demo
- pscad与matlab接口,PSCAD/EMTDC与Matlab接口研究
- Nginx Upload Module 上传模块
- Atitit. 衡量项目规模 ----包含的类的数量 .net java类库包含多少类 多少个api方法??
- EEGLAB合辑 | 第一节 往EEGLAB导入数据
- 2021华硕秋季新品发布会:每一幕,都精彩
- 计算机网页文档无法复制怎么办,电脑网页不能右键复制怎么办|电脑无法复制网页内容的解决方法...
- Direct Boot Mode
- 白帽子讲web安全之 浏览器安全
- JDBC中executeQuery、executeUpdate和execute之间的区别
- Windows Terminal美化杂记-Windows Terminal使用与配置