【LeetCode】198.打家劫舍

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;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章