力扣 中等 198.打家劫舍

文章目录

题目介绍


题解

法一:动态规划 和716最少花费爬楼梯思路一样 链接

  1. 确定dp数组(dp table)以及下标的含义:dp[i]的定义为到第i号房屋能偷窃到的最高金额为dp[i]
  2. 确定递推公式:可以有两个途径得到dp[i],一个是dp[i-1] 一个是dp[i-2]。所以 dp[i] = Math.max(dp[i - 2] + nums[i], dp[i - 1])
  3. dp数组如何初始化:dp[0] = nums[0]; dp[1] = Math.max(nums[0], nums[1]);
  4. 确定遍历顺序
  5. 举例推导dp数组
java 复制代码
// nums.length是大于等于1的
class Solution {
    public int rob(int[] nums) {
        int n = nums.length;
        if(n == 1){
            return nums[0];
        }
        if(n == 2){
            return Math.max(nums[0], nums[1]);
        }
        int[] dp = new int[n];
        dp[0] = nums[0];
        dp[1] = Math.max(nums[0], nums[1]);
        for(int i = 2; i < n; i++){
            dp[i] = Math.max(dp[i - 2] + nums[i], dp[i - 1]);
        }
        return dp[n - 1];
    }
}

或者:
class Solution {
    public int rob(int[] nums) {
        int n = nums.length;
        int[] dp = new int[n + 2];
        for (int i = 0; i < n; i++) {
            dp[i + 2] = Math.max(dp[i + 1], dp[i] + nums[i]);
        }
        return dp[n + 1];
    }
}

法二:递归 回溯

java 复制代码
class Solution {
    private int[] nums, memo;

    public int rob(int[] nums) {
        this.nums = nums;
        int n = nums.length;
        memo = new int[n];
        Arrays.fill(memo, -1); // -1 表示没有计算过
        return dfs(n - 1); // 从最后一个房子开始思考
    }

    // dfs(i) 表示从 nums[0] 到 nums[i] 最多能偷多少
    private int dfs(int i) {
        if (i < 0) { // 递归边界(没有房子)
            return 0;
        }
        if (memo[i] != -1) { // 之前计算过
            return memo[i];
        }
        int res = Math.max(dfs(i - 1), dfs(i - 2) + nums[i]);
        memo[i] = res; // 记忆化:保存计算结果
        return res;
    }
}
相关推荐
上弦月-编程几秒前
Java类与对象:编程核心解密
java·开发语言·jvm
weixin_307779132 分钟前
基于Vosk与CTranslate2的实时语音识别翻译系统 —— 完整C++实现详解
人工智能·算法·自动化·语音识别·原型模式
Kapaseker3 分钟前
为什么 Java 的数组需要 new 出来
android·java·kotlin
akarinnnn6 分钟前
深入理解内存函数:原理、应用与优化
c语言·网络·数据结构·算法
Dicky-_-zhang9 分钟前
线上故障排查与应急响应实战:从零开始建立你的SRE体系
java·jvm
大大杰哥9 分钟前
从 Volatile 到 ThreadLocal:Java 线程安全机制备忘
java·开发语言·jvm
一行代码一行诗++14 分钟前
for循环中的break和continue
数据结构·算法
AI人工智能+电脑小能手16 分钟前
【大白话说Java面试题 第67题】【JVM篇】第27题:生产环境服务器变慢,诊断思路和性能评估谈谈?
java·服务器·jvm·面试
Tisfy17 分钟前
LeetCode 3043.最长公共前缀的长度:哈希表(不转string)
算法·leetcode·散列表·题解·哈希表
代码中介商18 分钟前
排序算法完全指南(三):插入排序深度详解
算法·排序算法