leetcode 213 House Robber II


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

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

示例 1:

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

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

1.先考慮一個問題,就是原條件中第一個與最后一個可以同時取.這個問題就是leetcode---打家劫舍1
記解決這個問題函數為 solve(int[] nums)
狀態轉移方程:
dp[i]=max(dp[i-2],dp[i-3])
2.增加了第一個和最后一個不能同時取的限制后,可以發現,
這時的最大值要么在solve(nums[0:nums.length-1])
或者在solve(nums[1:nums.length])
即把原問題划分為2個solve()問題

var rob = function(nums) {
    const n = nums.length;
    if (n < 2) return n? nums[0]: 0;
    return Math.max(robber(nums, 0, n-2), robber(nums, 1, n-1));
};

function robber(nums, start, end) {
    let pre = 0, cur = 0;
    for (let i=start;i<=end;i++) {
        let temp = Math.max(pre+nums[i], cur);
        pre = cur;
        cur = temp;
    }
    return cur;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM