198. 打家劫舍

212 阅读1分钟

题目描述

image.png

未优化的DP

A0721B89FCBCC11E44B40A2BC00DF3B6.png

class Solution {
    public int rob(int[] nums) {
        int[] dp = new int[nums.length];
        dp[0] = nums[0];
        int max = dp[0];
        if (nums.length <= 1) {
            return max;
        }
        dp[1] = Math.max(nums[0], nums[1]);
        max = Math.max(dp[0], dp[1]);
        for (int i = 2; i < nums.length; i++) {
            dp[i] = Math.max(nums[i] + dp[i - 2], dp[i - 1]);//dp[i] 表示走到i个房屋时,目前能偷到的最大值
            max = Math.max(max, dp[i]);
        }
        return max;
    }
}

优化空间

class Solution {
    public int rob(int[] nums) {
        // int[] dp = new int[nums.length]; 
        int b = nums[0];
        int max = b;
        if (nums.length <= 1) {
            return max;
        }
        int a = Math.max(nums[0], nums[1]);
        max = Math.max(a, b);
        for (int i = 2; i < nums.length; i++) {
            int c = Math.max(nums[i] + b, a); // b是最远的,a是第二远
            // dp[i] = Math.max(nums[i] + dp[i - 2], dp[i - 1]);
            max = Math.max(max, c);
            b = a;
            a = c;
        }
        return max;
    }
}