1. 程式人生 > >打家劫舍(House Robber)java

打家劫舍(House Robber)java

打家劫舍(House Robber)

題幹


你是一個專業的小偷,計劃偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。

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

示例 1:

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

示例 2:

輸入: [2,7,9,3,1]
輸出: 12
解釋: 偷竊 1 號房屋 (金額 = 2), 偷竊 3 號房屋 (金額 = 9),接著偷竊 5 號房屋 (金額 = 1)。
     偷竊到的最高金額 = 2 + 9 + 1 = 12 。

分析

很明顯的是動態規劃題。對於動態規劃題就是找他的動態規劃方程,也就是找規律。
拿示例1講解:[1,2,3,1]

我們會發現我們找的就是當前房屋金額和之前的間隔房屋最大金額與相鄰房屋最大金額的最大值。
使用nums陣列儲存房屋的金額數,使用一個數組arr作為偷到該房屋最大金額數的儲存,長度等於房屋數。對於arr[0]就是他自己的金額數為nums[0]=1,對於arr[1]呢,就是nums[0]和nums[1]的較大者,那麼對於arr[i],我們能得到的最大金額是多少呢?就是它的金額數和間隔的房屋最大金額數與它相鄰的房屋最大金額數。即:num[i]+arr[i-2]與arr[i-1]的較大者。

動態規劃方程為:arr[i] = Math.max(nums[i]+arr[i-2],arr[i-1]);

程式碼

    public int rob(int[] nums) {
        int len = nums.length;
        if (nums.length == 0) {
            return 0;
        } else if (nums .length == 1) {
            return nums[0];
        }
        int [] arr = new int[len];
        arr[0
] = nums[0]; arr[1] = nums[1] > nums[0] ? nums[1] : nums[0]; for (int i = 2; i < len; i++) { arr[i] = Math.max(nums[i]+arr[i-2],arr[i-1]); } return arr[len-1]; }

執行結果

執行結果