【算法解析LeetCode by Javascript】213. 打家劫舍 II

clipboard.png

題目描述

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

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

示例 1:測試

輸入: [2,3,2]
輸出: 3
解釋: 你不能先偷竊 1 號房屋(金額 = 2),而後偷竊 3 號房屋(金額 = 2), 由於他們是相鄰的。
示例 2:優化

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


解析

此題爲典型的動態規劃問題,可是咱們須要考慮幾種特殊狀況code

此題爲一個環,因此兩端不可並行探索,因此分爲兩種狀況,blog

第一種 探索 0 - (length - 2)
第二種 探索 1 - (length - 1)ip

在考慮只有長度爲1或2的時候ci

綜合考慮數學

先放出全部代碼

/**
 * @param {number[]} nums
 * @return {number}
 */
var rob = function(nums) {
    //特殊狀況
    const len = nums.length
    if (len === 0) return 0
    if (len === 1) return nums[0]
    if (len === 2) return Math.max(nums[0], nums[1])
    
    const rob = function(nums, start, end) {
        let pMax = nums[start]
        let cMax = Math.max(pMax, nums[start + 1])
        
        for (let i = start + 2; i <= end; i++) {
            console.log(i,cMax,pMax)
            let tmp = cMax
            cMax = Math.max((pMax +nums[i]), cMax)
            pMax = tmp
        }
        
        return cMax
    }
    
    return Math.max(rob(nums, 0, len-2), rob(nums, 1, len-1))    
};
動態規劃函數爲 rob

詳細解析下rob

先科普下動態規劃思想

動態規劃(dynamic programming)是運籌學的一個分支,是求解決策過程(decision process)最優化的數學方法。20世紀50年代初美國數學家R.E.Bellman等人在研究多階段決策過程(multistep decision process)的優化問題時,提出了著名的最優化原理(principle of optimality),把多階段過程轉化爲一系列單階段問題,利用各階段之間的關係,逐個求解,創立了解決這類過程優化問題的新方法——動態規劃。1957年出版了他的名著《Dynamic Programming》,這是該領域的第一本著做。

簡單來講,動態規劃就是尋找每一個階段的最優解

那咱們先按照第一種狀況分析下(從0 到 length - 2)

假設咱們進行測試的數組爲
[3,1,5,12,6,8,13,2]
那咱們探索
首先咱們進行前兩個的探索,而後每加一個數,進行兩種狀況的比較,選出局部最優解
【3,1】最優解爲3 前最優解爲3
【3,1,5】最優解爲8 前最優解爲3 【3 + 5】
【3,1,5,12】最優解爲 3 + 12 = 15 > 8 最優解爲 【3 + 12】前最優解爲8
【3,1,5,12,6】最有解爲 15 > 8 + 6 最優解爲 【3 + 12】前最優解爲 15
【3,1,5,12,6,8】最優解爲 15 + 8 > 15 最優解爲 【3 + 12 + 8】爲23 前最優解爲15
【3,1,5,12,6,8,13】最優解爲 15 + 13 > 23 最優解爲 【3 + 12 + 13】前最優解爲23
【3,1,5,12,6,8,13,2】最優解爲 28 > 23 + 2 最優解爲 【3 + 12 + 13】

依次類推 保證每一個階段都有最優解

最終提交

clipboard.png

經過

相關文章
相關標籤/搜索