目录
1.每日一句
任何事情把期待值降到最低,所有遇见的都是礼物
2.作者简介
🏡个人主页:XiaoXiaoChen-2716
📚学习专栏:力扣专栏
🕒发布日期:2022/11/27
『LeetCode|每日一题』打家劫舍||
1.每日一题
2.解题思路
2.1 思路分析
这个题目和打家劫舍|的区别就是第一间和最后一间也是相邻的,不能都偷窃这两个房间
S1:首先分析,第一间和最后一间我们要是能把它们分开就好了,于是想到了把第一间到倒数第二间作为一个数组,第二间到最后一间作为一个数组,这样就成功的把它们两间房间分开了;
S2:那么接下来就和打家劫舍|的思路一样,从第三间房间开始,要么偷当前房间和隔了一间的房间,要么就是偷左边相邻的那个房间的,取其中的最大值即可;
详细的思路可以看打家劫舍|:打家劫舍|详解
2.2 核心代码
private int dp(int[] nums){
int l = nums.length;
int[] dt = new int[l];
dt[0] = nums[0];
dt[1] = Math.max(nums[0] , nums[1]);
int res = 0;
for(int i = 2 ; i < l ; i++){
dt[i] = Math.max(dt[i - 1] , dt[i - 2] + nums[i]);
}
return dt[l - 1];
}
2.3 完整代码
class Solution {
public int rob(int[] nums) {
int len = nums.length;
if(len == 0) return 0;
if(len == 1) return nums[0];
if(len == 2) return Math.max(nums[0] , nums[1]);
int res = 0;
res = Math.max(dp(Arrays.copyOfRange(nums , 0 , len - 1)) , dp(Arrays.copyOfRange(nums , 1 , len)));
return res;
}
private int dp(int[] nums){
int l = nums.length;
int[] dt = new int[l];
dt[0] = nums[0];
dt[1] = Math.max(nums[0] , nums[1]);
int res = 0;
for(int i = 2 ; i < l ; i++){
dt[i] = Math.max(dt[i - 1] , dt[i - 2] + nums[i]);
}
return dt[l - 1];
}
}
2.4 运行结果
🍁 类似题目推荐:
如果文章对各位大佬有帮助就支持一下噢,新手尝试,不好的地方请各位大佬多多指教!