地址:https://leetcode-cn.com/problems/house-robber-ii
思路:分解成两个 LeetCode 第 198 题:打家劫舍(动态规划),反正我是没想到,记住就可以了。
Java 代码:
import java.util.Arrays;
public class Solution {
private int tryRob(int[] nums) {
int len = nums.length;
if (len == 0) {
return 0;
}
if (len == 1) {
return nums[0];
}
int[] dp = new int[len];
dp[0] = nums[0];
dp[1] = Math.max(nums[0], nums[1]);
for (int i = 2; i < len; i++) {
dp[i] = Math.max(dp[i - 1], nums[i] + dp[i - 2]);
}
return dp[len - 1];
}
public int rob(int[] nums) {
int len = nums.length;
if (len == 0) {
return 0;
}
if (len == 1) {
return nums[0];
}
return Math.max(tryRob(Arrays.copyOfRange(nums, 0, len - 2 + 1)), tryRob(Arrays.copyOfRange(nums, 1, len - 1 + 1)));
}
}
说明:copyOfRange
方法的 to
参数是 exclusive
,因此我在写的时候显式加了 1
。