@author: sdubrz
@date: 2020.04.16
題號: 198
題目難度: 簡單
考察內容: 動態規劃
原題鏈接 https://leetcode-cn.com/problems/house-robber/
題目的著作權歸領釦網絡所有,商業轉載請聯繫官方授權,非商業轉載請註明出處。
解題代碼轉載請聯繫 lwyz521604#163.com
你是一個專業的小偷,計劃偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。
給定一個代表每個房屋存放金額的非負整數數組,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。
示例 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 。
通過次數100,127提交次數226,125
解法
記 money(i)
爲子數組 nums[1...n]
的最優解。則 money(1)=nums[1]
, money(2)=max{nums[1], nums[2]}
。 對於給定的一個 n
,如果我們已知 money(i)
, i<n
,那麼對於當前的第 n
個元素,有兩種可能的操作:
- 偷
nums[n]
,則一定不能偷nums[n-1]
。在這種情況下最大的收益爲money(n-2)+nums[n]
。 - 不偷
nums[n]
。這種情況下,最大的收益爲money(n-1)
。
則最終的 money(n)
就是以上兩種中的較大者。下面是具體的實現代碼:
class Solution {
public int rob(int[] nums) {
if(nums.length==0){
return 0;
}
if(nums.length==1){
return nums[0];
}
int[] money = new int[nums.length];
money[0] = nums[0];
money[1] = Math.max(nums[0], nums[1]);
for(int i=2; i<money.length; i++){
money[i] = Math.max(money[i-1], money[i-2]+nums[i]);
}
return money[money.length-1];
}
}
在 LeetCode 系統中的提交結果如下
執行結果: 通過 顯示詳情
執行用時 : 0 ms, 在所有 Java 提交中擊敗了 100.00% 的用戶
內存消耗 : 36.9 MB, 在所有 Java 提交中擊敗了 6.52% 的用戶