LeetCode#213 打家劫舍II Java

@author: sdubrz
@date: 2020.04.17
題號: 213
題目難度: 中等
考察內容: 動態規劃
原題鏈接 https://leetcode-cn.com/problems/house-robber-ii/
題目的著作權歸領釦網絡所有,商業轉載請聯繫官方授權,非商業轉載請註明出處。
解題代碼轉載請聯繫 lwyz521604#163.com

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

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

示例 1:

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

示例 2:

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

通過次數29,468 提交次數78,830

解法

這道題是之前第198道打家劫舍的升級版。與之前不同的是這裏房屋都圍成了一圈,第1個房屋和第n個房屋是相鄰的。所有的房屋形成了一個環狀的結構。對於這個問題,我們可以隨便挑出一間房屋,將這個環砍斷,這樣就可以把問題轉化成之前第198題的問題了。如下圖所示,對於第 n 間房,可以有兩種選擇:偷和不偷。當選擇偷第 n 間房時,則一定不能偷第 1 間和第 n-1 間,則其結果就變成了對第 2 到第 n-2 個元素組成的子數組的無環版打家劫舍問題。如果選擇不偷第 n 間房,則第 1 間和第 n-1 間都可以選擇偷或者不偷,那麼問題就變成了第 1 到第 n-1 個元素所組成的子數組的無環版打家劫舍問題。最後取這兩種情況中收益較大的作爲最終的結果。

在這裏插入圖片描述

下面是Java實現的代碼:

class Solution {
    public int rob(int[] nums) {
        if(nums.length==0){
            return 0;
        }
        if(nums.length<=3){
            int max = nums[0];
            for(int i=1; i<nums.length; i++){
                if(nums[i]>max)
                    max = nums[i];
            }
            return max;
        }
        int n = nums.length;
        int[] money1 = new int[n];  // 偷第n個
        int[] money2 = new int[n];  // 不偷第n個

        money1[1] = nums[1];
        money1[2] = Math.max(nums[1], nums[2]);
        for(int i=3; i<n-2; i++){
            money1[i] = Math.max(money1[i-2]+nums[i], money1[i-1]);
        }

        money2[0] = nums[0];
        money2[1] = Math.max(nums[0], nums[1]);
        for(int i=2; i<n-1; i++){
            money2[i] = Math.max(money2[i-2]+nums[i], money2[i-1]);
        }

        return Math.max(money1[n-3]+nums[n-1], money2[n-2]);
        
    }
}

在 LeetCode 系統中的提交結果如下:

執行結果:通過 顯示詳情
執行用時 : 0 ms, 在所有 Java 提交中擊敗了 100.00% 的用戶
內存消耗 : 36.9 MB, 在所有 Java 提交中擊敗了 9.09% 的用戶
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章