198.打家劫舍
记录自己的算法:
1.初代版本:
public int rob(int[] nums) {
int length = nums.length;
if(length == 0) return 0;
if(length == 1) return nums[0];
if(length == 2) return Math.max(nums[0],nums[1]);
int[] dp = new int[length];
dp[0] = nums[0];
dp[1] = nums[1];
for(int i = 2;i<length;i++){
dp[i] = Math.max(dp[i-1],nums[i] + dp[i-2]);
}
Arrays.sort(dp);
return dp[length-1];
}
2.发现问题:当数组(nums)是[2,1,1,2]时,代码通不过,根据我的代码来看,总是理想的将dp[i-1]和dp[i-2]看成上一次得到的最大结果。其实不然,对于这个[2,1,1,2]数组,我的代码只能拿到最大结果为3,而真正的其实是nums[0]+nums[3] = 4.所以改进代码。
3.改进之后(复杂度成问题)
public int rob(int[] nums) {
int length = nums.length;
if(length == 0) return 0;
if(length == 1) return nums[0];
if(length == 2) return Math.max(nums[0],nums[1]);
int[] dp = new int[length];
dp[0] = nums[0];
dp[1] = nums[1];
for(int i = 2;i<length;i++){
dp[i] = Math.max(dp[i-1],nums[i] + max(i-2,dp));
}
Arrays.sort(dp);
return dp[length-1];
}
public static int max(int i,int[] arr){
int max = -1;
for(int j = 0;j<=i;j++){
if(arr[j] > max){
max = arr[j];
}
}
return max;
}