『LeetCode|每日一题』---->打家劫舍||

目录

1.每日一句

2.作者简介

『LeetCode|每日一题』打家劫舍||

1.每日一题

2.解题思路

        2.1 思路分析

        2.2 核心代码

        2.3 完整代码

        2.4 运行结果 


1.每日一句

任何事情把期待值降到最低,所有遇见的都是礼物

2.作者简介

个人主页:XiaoXiaoChen-2716 

学习专栏:力扣专栏

发布日期:2022/11/27

 『LeetCode|每日一题』---->打家劫舍||_第1张图片

『LeetCode|每日一题』打家劫舍||

1.每日一题

原文链接--->点我

『LeetCode|每日一题』---->打家劫舍||_第2张图片

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 运行结果

『LeetCode|每日一题』---->打家劫舍||_第3张图片


 类似题目推荐: 

1.数据结构基础

2.算法专项练习

3.剑指offer专项练习

4.推荐一个学习网站:LeetCode,算法的提升在于日积月累,只有每天练习才能保持良好的状态

如果文章对各位大佬有帮助就支持一下噢,新手尝试,不好的地方请各位大佬多多指教!  

 

你可能感兴趣的:(LeetCode专栏,leetcode,算法,java,动态规划)