198打家劫舍
解法一:
class Solution {
public int rob(int[] nums) {
if(nums.length==1) {
return nums[0];
}
if(nums.length==2) {
return Math.max(nums[0],nums[1]);
}
int[] values = new int[nums.length];
values[0] = nums[0];
values[1] = nums[1];
values[2] = nums[0] + nums[2];
for(int i= 3;i<nums.length;i++) {
values[i] = Math.max(values[i-3],values[i-2])+ nums[i];
}
return Math.max(values[nums.length-2],values[nums.length-1]);
}
}
int[i] values :从头开始到包含nums i 的最大值
values[i] = Math.max(values[i-3],values[i-2])+ nums[i];// i-1不能选,考虑i-2和i-3两种情况就行,i-4和话可以加上nums[i-2]获得更大的值
Math.max(values[nums.length-2],values[nums.length-1]);//最后答案分为两种情况,包含num[length-1]和不包含num[length-1],两者取最大值。
官方解法:
class Solution {
public int rob(int[] nums) {
if(nums.length==1) {
return nums[0];
}
// if(nums.length==2) {
// return Math.max(nums[0],nums[1]);
// }
int[] dp = new int[nums.length];
dp[0] = nums[0];
dp[1] = Math.max(nums[0],nums[1]);
for(int i= 2;i<nums.length;i++) {
//dp[i] = Math.max(dp[i-1]+nums[i],dp[i-1]);
dp[i] = Math.max(dp[i-2]+nums[i],dp[i-1]);
}
return dp[nums.length-1];
}
}
int[i] values :从头开始到nums i 的最大值,分两种情况不包含nums i-1和包含(包含nums i 和不包含):
dp[i] = Math.max(dp[i-2]+nums[i],dp[i-1]);。
740删除并获得点数【打家劫舍又来了/预处理数组版打家劫舍】
class Solution {
public int deleteAndEarn(int[] nums) {
if(nums.length==1) {
return nums[0];
}
int maxValue = nums[0];
for(int i=1;i<nums.length;i++) {
if(nums[i]>maxValue) {
maxValue=nums[i];
}
}
int[] arr = new int[maxValue+1];
for(int i=0;i<nums.length;i++) {
arr[nums[i]] += nums[i];
}
return rob(arr);
}
public int rob(int[] nums) {
if(nums.length==1) {
return nums[0];
}
int[] dp = new int[nums.length];
dp[0] = nums[0];
dp[1] = Math.max(nums[0],nums[1]);
for(int i= 2;i<nums.length;i++) {
dp[i] = Math.max(dp[i-2]+nums[i],dp[i-1]);
}
return dp[nums.length-1];
}
}