[Leedcode][JAVA][第198题][打家劫舍][动态规划]
【问题描述】[简单]
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例 1:输入: [1,2,3,1]
输出: 4
解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。
【解答思路】
1. 动态规划
第 1 步:设计状态
int[] dp = new int[len + 1];
第 2 步:状态转移方程
dp[n] = MAX( dp[n-1], dp[n-2] + num )
第 3 步:考虑初始化
dp[0] = 0;
dp[1] = nums[0];
第 4 步:考虑输出
dp[len]
第 5 步:考虑是否可以状态压缩
方法2
时间复杂度:O(N) 空间复杂度:O(N)
class Solution {public int rob(int[] nums) {int len = nums.length;if(len == 0)return 0;int[] dp = new int[len + 1];dp[0] = 0;dp[1] = nums[0];for(int i = 2; i <= len; i++) {dp[i] = Math.max(dp[i-1], dp[i-2] + nums[i-1]);}return dp[len];}
}
与上面方法略有不同
class Solution {public int rob(int[] nums) {int n = nums.length;// 处理边界条件。if (n == 0) {return 0;}if (n == 1) {return nums[0];}// 定义dp数组,按照状态转移方程递推。int[] dp = new int[n];dp[0] = nums[0];dp[1] = Math.max(nums[0], nums[1]);for (int i = 2; i < n; i++) {dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i]);}return dp[n - 1];}
}
2. 动态规划压缩空间
参照着 dp[i] = max(dp[i - 1], dp[i - 2] + nums[i]) 这个方程来写,
用 a 表示 i - 2,b 表示 i - 1,
因此上面的方程变成了dp[i] = max(b, a + nums[i]),
然后下一轮循环的时候:
i - 1 就变成了i - 2,因此现在需要把 b 赋值给 a;
i 就变成了 i - 1,因此现在需要把 dp[i] 赋值给 b。
时间复杂度:O(N) 空间复杂度:O(1)
class Solution {public int rob(int[] nums) {int a = 0, b = 0;for (int i = 0; i < nums.length; i++) {int c = Math.max(b, a + nums[i]);a = b;b = c;}return b;}
}
【总结】
1.dp数组设置多一个 在前面添加后者后面添加
int[] dp = new int[len + 1];
2.动态规划流程
第 1 步:设计状态
第 2 步:状态转移方程
第 3 步:考虑初始化
第 4 步:考虑输出
第 5 步:考虑是否可以状态压缩
3.动态规划做多了 第一次自己写了出来,可惜初始化没有想全面
转载链接:https://leetcode-cn.com/problems/house-robber/solution/liang-ge-yue-0ji-chu-cong-an-mo-shi-zhuan-xing-zi-/
[Leedcode][JAVA][第198题][打家劫舍][动态规划]相关推荐
- [Leedcode][JAVA][第45题][跳跃游戏 II][贪心算法]
[问题描述][Leedcode][JAVA][第45题][跳跃游戏 II] 输入: [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是 2.从下标为 0 跳到下标为 1 的位置 ...
- [Leedcode][JAVA][第105题][从前序与中序遍历序列构造二叉树][栈][递归][二叉树]
[问题描述][中等] 根据一棵树的前序遍历与中序遍历构造二叉树.注意: 你可以假设树中没有重复的元素.例如,给出前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = ...
- [Leedcode][JAVA][第470题][Ran7()实现Rand10()]
[问题描述][Leedcode][JAVA][第470题][Ran7()实现Rand10()] 已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10 生成 1 到 ...
- [Leedcode][JAVA][第300题][最长上上子序列][动态规划][压缩空间]
[问题描述][中等] 给定一个无序的整数数组,找到其中最长上升子序列的长度.示例:输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它 ...
- [剑指offer]面试题第[42]题[Leedcode][JAVA][第53题][最大子序和][动态规划][贪心][分治]
[问题描述][第53题][最大子序和][中等] 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和.示例:输入: [-2,1,-3,4,-1,2,1, ...
- [Leedcode][JAVA][第887题][鸡蛋掉落][谷歌面试][动态规划]
[问题描述] [887. 鸡蛋掉落] 你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N 共有 N 层楼的建筑.每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去.你知道存在楼层 F ,满足 ...
- [Leedcode][JAVA][第22题括号生成][DFS][BFS][动态规划]
[问题描述]22. 括号生成 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合. 示例:输入:n = 3 输出:["((()))",&q ...
- [Leedcode][JAVA][第72题][动态规划]
[问题描述] [72. 编辑距离] 给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 .你可以对一个单词进行如下三种操作:插入一个字符 删除一 ...
- [Leedcode][JAVA][第152题][乘积最大子数组][动态规划]
[问题描述][中等] 给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积.示例 1:输入: [2,3,-2,4] 输出: 6 解 ...
最新文章
- 黑马程序员java笔记之二-----多线程
- Docker安装(Mac)
- abap中取内表中每一类中的一行的方法
- 用户中心 - 修改用户信息
- 升级ADT22.6后,Android模拟器无法创建
- Redis Client On Error: Error: connect ECONNREFUSED 192.168.xxx.105:6379 Config right?
- 企业实战案例01_Jenkins_连接远程执行shell脚本
- CHIL-ORACLE-创建视图
- 查理·芒格的合伙人李录:价值投资在中国到底适不适用?
- 【可视化编程一】关于Unity可视化编程(Visual Scripting)
- VScode环境变量配置
- HttpClient4.x 文件上传
- HP LaserJet 1010 安装方法
- c语言json数据解析,C语言库函数解析JSON文件
- PSM价格敏感度模型
- 简易的微信公众号管理平台使用指南
- Netty in Action 中文版 --最贴近原著的翻译
- LintCode 488.快乐数
- DDR3学习总结(二)
- 【算力网络】算力网络的技术创新——绿色与安全关键技术