198. House Robber

1.递归, 见递归树,黄色为重叠部分结果

public int rob(int[] nums) {
    return tryRob(nums, 0);
}

public int tryRob(int[] nums, int index) {
    if (index >= nums.length) return 0;
    int res = 0;
    for (int i = index; i < nums.length; i++) {
        res = Math.max(res, nums[i] + tryRob(nums, i + 2));
    }
    return res;
}

2.memo, 为index添加缓存

public int rob(int[] nums) {
    int[] memo = new int[nums.length];
    Arrays.fill(memo, -1);
    return tryRob(nums, 0, memo);
}

public int tryRob(int[] nums, int index, int[] memo) {
    if (index >= nums.length) return 0;
    if (memo[index] != -1) return memo[index];
    int res = 0;
    for (int i = index; i < nums.length; i++) {
        res = Math.max(res, nums[i] + tryRob(nums, i + 2, memo));
    }
    memo[index] = res;
    return res;
}

3.dp

public int rob(int[] nums) {
    if (nums == null || nums.length == 0) return 0;
    int n = nums.length;
    int[] dp = new int[n + 1];
    dp[0] = 0;
    dp[1] = nums[0];
    for (int i = 2; i <= n; i++) {
        dp[i] = Math.max(dp[i - 1], nums[i - 1] + dp[i - 2]);
    }
    return dp[n];
}

results matching ""

    No results matching ""