_198打家劫舍

_198打家劫舍

原题链接:

_198打家劫舍

https://leetcode.cn/problems/house-robber/submissions/496496112/

完成情况:

解题思路:

_198打家劫舍

java 复制代码
package 代码随想录.动态规划;

public class _198打家劫舍 {
    /**
     *
     * @param nums
     * @return
     */
    public int rob(int[] nums) {
        // TODO 每次偷窃后,必须至少冷却一天,问多大头去数量数多少
        if(nums == null || nums.length == 0){
            return 0;
        }
        if (nums.length == 1) {
            return nums[0];
        }
        //有多个时,才需要使用到dp
        int [] dp = new int[nums.length];
        //模拟出取每一个长度位置时的最大累计和
        dp[0] = nums[0];
        dp[1] = Math.max(dp[0],nums[1]);
        for (int i=2;i< nums.length;i++){
            dp[i] = Math.max(dp[i-1],dp[i-2]+nums[i]);
        }
        return dp[nums.length - 1];
    }
}

_198打家劫舍_滚动数组

java 复制代码
package 代码随想录.动态规划;

public class _198打家劫舍_滚动数组 {
    /**
     * 分析本题可以发现,所求结果仅依赖于前两种状态,此时可以使用滚动数组思想将空间复杂度降低为3个空间
     * @param nums
     * @return
     */
    public int rob(int[] nums) {
        int len = nums.length;
        if (len == 0){
            return 0;
        } else if (len == 1) {
            return nums[0];
        }else if (len == 2){
            return Math.max(nums[0],nums[1]);
        }
        //如果存在多个时。每次只看目之所及的三个
        int result [] = new int[3]; //用来存放选择的结果
        result[0] = nums[0];
        result[1] = Math.max(nums[0],nums[1]);
        //迭代遍历完整个数组
        for (int i=2;i< len;i++){
            result[2] = Math.max(result[0]+nums[i],result[1]);
            result[0] = result[1];
            result[1] = result[2];
        }
        return result[2];
    }
}

_198打家劫舍_滚动优化

java 复制代码
package 代码随想录.动态规划;

public class _198打家劫舍_滚动优化 {
    /**
     * 进一步对滚动数组的空间优化 dp数组只存与计算相关的两次数据
     * @param nums
     * @return
     */
    public int rob(int[] nums) {
        if (nums.length == 1) {
            return nums[0];
        }
        //初始化dp数组
        //优化空间,dp数组只用2个空间,只记录与当前计算相关的前两个结果
        int [] dp = new int[2];
        dp[0] = nums[0];
        dp[1] = Math.max(nums[0],nums[1]);
        int res = 0;
        //遍历
        for (int i=2;i< nums.length;i++){
            res = Math.max((dp[0] + nums[i]),dp[1]);
            dp[0] = dp[1];
            dp[1] = res;
        }
        //输出结果
        return dp[1];
    }
}

参考代码:

错误经验吸取

相关推荐
风象南22 分钟前
Claude Code这个隐藏技能,让我告别PPT焦虑
人工智能·后端
Mintopia1 小时前
OpenClaw 对软件行业产生的影响
人工智能
陈广亮2 小时前
构建具有长期记忆的 AI Agent:从设计模式到生产实践
人工智能
会写代码的柯基犬2 小时前
DeepSeek vs Kimi vs Qwen —— AI 生成俄罗斯方块代码效果横评
人工智能·llm
Mintopia2 小时前
OpenClaw 是什么?为什么节后热度如此之高?
人工智能
爱可生开源社区2 小时前
DBA 的未来?八位行业先锋的年度圆桌讨论
人工智能·dba
叁两5 小时前
用opencode打造全自动公众号写作流水线,AI 代笔太香了!
前端·人工智能·agent
前端付豪5 小时前
LangChain记忆:通过Memory记住上次的对话细节
人工智能·python·langchain
strayCat232555 小时前
Clawdbot 源码解读 7: 扩展机制
人工智能·开源