213. 打家劫舍II
动态规划
import java.util.Arrays;
class Solution {
public int rob(int[] nums) {
if (nums.length <= 2){
return Arrays.stream(nums).max().getAsInt();
}
int n = nums.length;
int max = 0;
/**
* 在《198. 打家劫舍》的基础上,对第一个和最后一个房屋只抢一个
*/
int[] dp = new int[n + 1];
dp[2] = nums[1];
/**
* 从第2个房屋开始
*/
for (int i = 3; i <= n; i++) {
dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i - 1]);
}
max = Math.max(dp[n - 1], dp[n]);
dp[1] = nums[0];
/**
* 从第1个房屋开始,但只抢到第n - 1个房屋
*/
for (int i = 2; i < n; i++) {
dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i - 1]);
}
return Math.max(max, Math.max(dp[n - 2], dp[n - 1]));
}
}
/**
* 时间复杂度 O(n)
* 空间复杂度 O(n)
*/
https://leetcode-cn.com/problems/house-robber-ii/