题解 | 打家劫舍(二)
打家劫舍(二)
https://www.nowcoder.com/practice/a5c127769dd74a63ada7bff37d9c5815
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型一维数组
* @return int整型
*/
public int rob (int[] nums) {
if (nums == null || nums.length == 0) {
return 0;
}
if (nums.length == 1) {
return nums[0];
}
//第一家打劫
int[][] dp = new int[nums.length][2];
dp[0][0] = 0;
dp[0][1] = nums[0];
//第一家不打劫
int[][] dp2 = new int[nums.length][2];
dp2[0][0] = 0;
dp2[0][1] = 0;
for (int i = 1; i < nums.length; i++) {
if (i >= 2) {
dp[i][1] = Math.max(dp[i - 1][0], Math.max(dp[i - 2][0],
dp[i - 2][1])) + nums[i];
dp[i][0] = Math.max(dp[i - 1][1], Math.max(dp[i - 2][0], dp[i - 2][1]));
dp2[i][1] = Math.max(dp2[i - 1][0], Math.max(dp2[i - 2][0],
dp2[i - 2][1])) + nums[i];
dp2[i][0] = Math.max(dp2[i - 1][1], Math.max(dp2[i - 2][0], dp2[i - 2][1]));
} else {
dp[i][1] = dp[i - 1][0] + nums[i];
dp[i][0] = dp[i - 1][1];
dp2[i][1] = dp2[i - 1][0] + nums[i];
dp2[i][0] = dp2[i - 1][1];
}
}
//第一个不打劫
int max = Math.max(dp2[nums.length - 1 ][0], dp2[nums.length - 1][1]);
//第一家打劫
int max2 = Math.max(dp[nums.length - 2][0], dp[nums.length - 2][1]);
return Math.max(max2, max);
}
}
因为首位相连,所以第一家和最后一家只能打劫一家。
所以定义两个dp数组。一个初始化第一家打劫,一个初始化第一家不打劫。
最后比较最大值。
第一家打劫的只能到到倒数第一家,第一家不打劫的可以到最后一家。
查看7道真题和解析