1. 程式人生 > 實用技巧 >根據磁碟空間清理日誌檔案

根據磁碟空間清理日誌檔案

打家劫舍 II

題目:
你是一個專業的小偷,計劃偷竊沿街的房屋,每間房內都藏有一定的現金。這個地方所有的房屋都 圍成一圈 ,這意味著第一個房屋和最後一個房屋是緊挨著的。同時,相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警 。

給定一個代表每個房屋存放金額的非負整數陣列,計算你 在不觸動警報裝置的情況下 ,能夠偷竊到的最高金額。

示例 1:

輸入:nums = [2,3,2]
輸出:3
解釋:你不能先偷竊 1 號房屋(金額 = 2),然後偷竊 3 號房屋(金額 = 2), 因為他們是相鄰的。
示例 2:

輸入:nums = [1,2,3,1]
輸出:4
解釋:你可以先偷竊 1 號房屋(金額 = 1),然後偷竊 3 號房屋(金額 = 3)。
偷竊到的最高金額 = 1 + 3 = 4 。
示例 3:

輸入:nums = [0]
輸出:0

接替思路:和打家劫舍類似,只是本題最後一間房和第一間房相連了,那麼就要想辦法將他們分開處理,也就是說分別判斷搶劫第一間房時的最大收益和搶劫最後一間房的最大收益

class Solution {
    public int rob(int[] nums) {
        int n = nums.length;
        if(n == 0)
            return 0;
        
        if(n == 1)
            return nums[0];
        
        //陣列定義:dp1表示不搶劫最後一個房屋,dp2表示不搶劫第一個房屋
        int dp1[][] = new int[n][2], dp2[][] = new int[n + 1][2];
        for(int i = 1; i < n; i++) {
            dp1[i][0] = Math.max(dp1[i - 1][0], dp1[i - 1][1]);
            dp1[i][1] = dp1[i - 1][0] + nums[i - 1];
        }
        
        int ans1 = Math.max(dp1[n - 1][0], dp1[n - 1][1]);
        
        for(int i = 2; i <= n; i++) {
            dp2[i][0] = Math.max(dp2[i - 1][0], dp2[i - 1][1]);
            dp2[i][1] = dp2[i - 1][0] + nums[i - 1];
        }
        
        int ans2 = Math.max(dp2[n][0], dp2[n][1]);
        
        return Math.max(ans1, ans2);
    }
}