_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];
    }
}

参考代码:

错误经验吸取

相关推荐
看-是灰机5 小时前
Milvus向量数据库
linux·运维·人工智能·机器学习·milvus
新新学长搞科研5 小时前
【厦门大学主办丨IEEE出版】第六届人工智能、机器人和通信国际会议(ICAIRC 2026)
人工智能·机器人·信息与通信
LiuPig刘皮哥6 小时前
xiaoke.ai 小可爱技术路线图解:3D 陪玩、虚拟陪伴、透明桌宠
人工智能·3d·开源
weixin_549808366 小时前
AI HR进入日常工作:AI原生如何改变业务交接,eRoad iBuilder如何参与
大数据·人工智能·ai-native
坐吃山猪6 小时前
AI复刻网站功能初体验
人工智能·开发
初学者↑6 小时前
知识图谱+智能体的智慧旅游问答系统
人工智能·知识图谱·旅游
科技每日热闻6 小时前
企业使用大模型顾虑数据泄露,推荐选用哪些安全可靠的生成式 AI 平台?
人工智能·ai
SelectDB技术团队6 小时前
VARIANT 列接入网关 JSON 日志:建表、导入、子列查询与物化的完整步骤
大数据·数据库·人工智能·elasticsearch·搜索引擎·json·apache doris
余额瞒着我当琳6 小时前
C++算法学习篇5--二分查找法
c++·学习·算法
涛思数据(TDengine)6 小时前
TDengine IDMP 2.0.2 发布:元素关系可视化、数据建模与联邦查询三大升级
大数据·数据库·人工智能·时序数据库·tdengine·工业互联网·工业ai