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;
}