leetcode198打家劫舍java题解(动态规划)
1.题目
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。
示例 1:
输入: [1,2,3,1]输出: 4
解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。 偷窃到的最高金额 = 1 + 3 = 4 。
示例 2:
输入: [2,7,9,3,1]输出: 12
解释: 偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。 偷窃到的最高金额 = 2 + 9 + 1 = 12 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/house-robber
2.想法
利用0-1背包问题,首先考虑特殊情况,数组内容为空和数组中只有一个数字,一个返回0一个返回第一个数字。利用全局最优化,依次比较选与不选的最大最小,若选择该数则跳过相邻值,继续计算;若不选择该数则选择相邻值继续计算。最终返回结果数组的最后一个数即为结果。
3.图解
有兴趣的话可以看一下B站灯笼大神的视频,这里给个链接
4.自己题解
class Solution {
public int rob(int[] nums) {
if(nums.length==0)return 0;
if(nums.length==1)return nums[0];
int result[]=new int[nums.length];
result[0]=nums[0];
result[1]=Math.max(nums[0],nums[1]);
for(int i=2;i<result.length;i++)
{
result[i]=Math.max(result[i-1],result[i-2]+nums[i]);
}
//System.out.print(Arrays.toString(result));
return result[result.length-1];
}
}
5.动态规划问题
(1)0-1背包问题
0-1背包问题指的是每个物品只能使用一次。
(2)点解
可以查看一下dd大牛的背包九讲以及B站灯笼大神的动态规划讲解
6.效率
上一篇: 手写数字识别
下一篇: vue实现图片切换效果
推荐阅读
-
剑指offer 剪绳子(动态规划) Java
-
[Leetcode][第410题][JAVA][分割数组的最大值][动态规划][二分]
-
动态规划求解"疯狂的采药"问题(洛谷P1616题题解,Java语言描述)
-
Longest Valid Parentheses leetcode java (求最长有效匹配括号子串的长度)-动态规划
-
LeetCode 91. 解码方法(动态规划) Java
-
[Leetcode][第44题][JAVA][通配符匹配][贪心][动态规划]
-
【leetcode】44.通配符匹配(动态规划,贪心法,java实现)
-
动态规划-03要从二维数组的左上角走到右下角,请找出路径上的所有数字之和最小的路径java实现
-
【LeetCode】每日一题(一)打家劫舍系列 动态规划
-
Leetcode213. 打家劫舍 II【动态规划】