1. 程式人生 > >LeetCode演算法題198:打家劫舍解析

LeetCode演算法題198:打家劫舍解析

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

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

示例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 。

這個題一看就是要用動態規劃,設定一個數組儲存到當前為止可以偷到的最多的金額,更新當前最高金額的方法就是將當前數加前前金額與前一最大金額對比,哪個大就是當前可偷最大金額。這樣說來也就不需要存所有的過程最大金額了,只需要存兩個金額,前前一個最大金額和前一個最大金額就可以計算了。
C++原始碼:

class Solution {
public:
    int rob(vector<int>& nums) {
        int n = nums.size();
        if (n==0) return 0;
        if (n==1) return nums[
0]; int ppre = nums[0]; int pre = ppre>nums[1]?ppre:nums[1]; for (int i=2;i<n;i++) { int now = ppre + nums[i]; ppre = pre; pre = now>pre?now:pre; } return pre; } };

python3原始碼:

class Solution:
    def
rob(self, nums): """ :type nums: List[int] :rtype: int """ n = len(nums) if n==0: return 0 ppre = 0 pre = nums[0] for i in range(1,n): now = ppre + nums[i] ppre = pre pre = max(now, pre) return pre