国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

算法第十八天-打家劫舍Ⅱ

這篇具有很好參考價(jià)值的文章主要介紹了算法第十八天-打家劫舍Ⅱ。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

打家劫舍Ⅱ

題目要求

算法第十八天-打家劫舍Ⅱ,算法基礎(chǔ),算法

解題思路

  • [打家劫舍Ⅱ]是說兩個(gè)相鄰的房間不能同時(shí)偷,并且首尾兩個(gè)房間是相鄰的(不能同時(shí)偷首尾房間)
  • 明顯是基于[打家劫舍Ⅰ]做的升級。[打家劫舍Ⅰ]也是說兩個(gè)相鄰的房間不能同時(shí)偷,但是首尾房間不是相鄰的(可以同時(shí)偷首尾房間)

所以,我們先從[打家劫舍Ⅰ]開始說起。

打家劫舍Ⅰ

題目:兩個(gè)相鄰的房間不能同時(shí)偷,首尾房間不相鄰,求小偷能獲取的最大金額。
對于[求數(shù)組中按照某種方法進(jìn)行選擇,求最值,而不用知道具體選擇方案]的問題,可以考慮動態(tài)規(guī)劃。動態(tài)規(guī)劃最基本的是[狀態(tài)的定義],然后比較困難的是[狀態(tài)轉(zhuǎn)移方程]。
[狀態(tài)定義]即dp[i],一般可以根據(jù)題意,題目要求什么,我們就定義什么。比如本題,我們定于dp[i]數(shù)組的前i個(gè)元素中按照[兩個(gè)相鄰的房間不能同時(shí)偷]的方法,能夠獲得到的最大值。(經(jīng)驗(yàn):定義dp[i]為數(shù)組的前i個(gè)元素的結(jié)果)
考慮[狀態(tài)轉(zhuǎn)移方程]是,一定要想辦法讓dp[i]能夠基于dp[0~i-1]生成。本題要求不能同時(shí)偷相鄰的房間。所以,dp[i]有兩種選擇:num[i]選或者不選。

  • 如果num[i]選,那么由于不能選擇相鄰的房間,所以不可以選擇num[i-1],所以選擇num[i]的情況下,數(shù)組的前i個(gè)元素構(gòu)成的最大值dp[i]=dp[i-2]+num[i];
  • 如果num[i]不選,那么就可以選擇num[i-1],所以數(shù)組的前i個(gè)元素構(gòu)成的最大值 等于 數(shù)組前i-1個(gè)元素構(gòu)成的最大值,即dp[i]=dp[i-1]
  • 所以,最終的dp[i]是上面兩種情況的最大值。

[初始條件]比較簡單:

  • dp[0] = num[0]
  • dp[1] = max(dp[0],num[1]) = max(num[0], num[1])

[返回結(jié)果],可以根據(jù)我們的dp[i]知道最終要求的是在整個(gè)數(shù)組上能夠取得的最大值。所以返回dp[N-1]

打家劫舍Ⅱ

在多了數(shù)組的開頭和結(jié)尾是相鄰的情況下,也就是說,數(shù)組的開頭和結(jié)尾元素不能同時(shí)選。由于狀態(tài)轉(zhuǎn)移方程中,是沒有標(biāo)記我們到底選了哪些元素的。所以如果想通過狀態(tài)轉(zhuǎn)移方程,來實(shí)現(xiàn)首尾元素不能同時(shí)選,是很難的。
這里就用上了技巧,分為兩種情況去考慮:分別在nums[0:N-1]上計(jì)算能獲得到的最大值,這兩種個(gè)情況取最大。這肯定能保證在物理上隔離了首尾兩個(gè)元素,肯定不會同時(shí)選到。

代碼

class Solution:
    def rob(self, nums: List[int]) -> int:
        N = len(nums)
        if not nums:
            return 0
        if N == 1:
            return nums[0]
        return max(self.rob1(nums[0:N - 1]), self.rob1(nums[1:N]))
    def rob1(self,nums:List[int]):    
        N = len(nums)
        if not nums:
            return 0
        if N == 1:
            return nums[0]
        # max amount [0, i]
        dp = [0] * N
        dp[0] = nums[0]
        dp[1] = max(nums[0], nums[1])
        for i in range(2, N):
            dp[i] = max(dp[i - 2] + nums[i], dp[i - 1])
        return dp[-1]

復(fù)雜度分析

時(shí)間復(fù)雜度: O ( N ) O(N) O(N)
空間復(fù)雜度: O ( 1 ) O(1) O(1)文章來源地址http://www.zghlxwxcb.cn/news/detail-795961.html

到了這里,關(guān)于算法第十八天-打家劫舍Ⅱ的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【算法】樹形DP ② 打家劫舍Ⅲ(樹上最大獨(dú)立集)

    【算法】樹形DP ② 打家劫舍Ⅲ(樹上最大獨(dú)立集)

    最大獨(dú)立集 需要從圖中選擇盡量多的點(diǎn),使得這些點(diǎn)互不相鄰。 337. 打家劫舍 III 用一個(gè)數(shù)組 int[] = {a, b} 來接收每個(gè)節(jié)點(diǎn)返回的結(jié)果 。返回值{a,b} a表示沒選當(dāng)前節(jié)點(diǎn)的最大值,b表示選了當(dāng)前節(jié)點(diǎn)的最大值。 使用 后序遍歷 dfs。 ( 發(fā)現(xiàn)樹形 DP 基本都是后序 dfs ) P1352 沒有上

    2024年02月12日
    瀏覽(27)
  • 代碼隨想錄刷題第48天|LeetCode198打家劫舍、LeetCode213打家劫舍II、LeetCode337打家劫舍III

    代碼隨想錄刷題第48天|LeetCode198打家劫舍、LeetCode213打家劫舍II、LeetCode337打家劫舍III

    1、LeetCode198打家劫舍 題目鏈接:198、打家劫舍 1、dp[i]:考慮下標(biāo)i(包括i)以內(nèi)的房屋,最多可以偷竊的金額為dp[i] 。 2、遞推公式: 如果偷第i房間,那么dp[i] = dp[i - 2] + nums[i] ; 如果不偷第i房間,那么dp[i] = dp[i - 1]; 然后dp[i]取最大值,即dp[i] = max(dp[i - 2] + nums[i], dp[i - 1

    2024年02月08日
    瀏覽(158)
  • 【LeetCode題目詳解】第九章 動態(tài)規(guī)劃part09 198.打家劫舍 213.打家劫舍II 337.打家劫舍III(day48補(bǔ))

    【LeetCode題目詳解】第九章 動態(tài)規(guī)劃part09 198.打家劫舍 213.打家劫舍II 337.打家劫舍III(day48補(bǔ))

    你是一個(gè)專業(yè)的小偷,計(jì)劃偷竊沿街的房屋。每間房內(nèi)都藏有一定的現(xiàn)金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統(tǒng), 如果兩間相鄰的房屋在同一晚上被小偷闖入,系統(tǒng)會自動報(bào)警 。 給定一個(gè)代表每個(gè)房屋存放金額的非負(fù)整數(shù)數(shù)組,計(jì)算你 不觸動

    2024年02月09日
    瀏覽(34)
  • 打家劫舍系列

    打家劫舍系列

    ?

    2024年02月15日
    瀏覽(17)
  • _198打家劫舍

    _198打家劫舍 https://leetcode.cn/problems/house-robber/submissions/496496112/

    2024年01月18日
    瀏覽(21)
  • 力扣198. 打家劫舍

    力扣198. 打家劫舍

    Problem: 198. 打家劫舍 1.定義狀態(tài): dp[i] 表示從第i個(gè)房子開始偷起可以偷得的最大金額數(shù)目; 2.狀態(tài)轉(zhuǎn)移:由于不能連續(xù)的偷相鄰的兩個(gè)房子,則為了使得從第i個(gè)房子開始偷起是最大金額則要判斷 是從當(dāng)前第i個(gè)房子開始偷(代碼中表示為nums[i] + dp[i + 2]),還是不偷當(dāng)前第i個(gè)房

    2024年04月25日
    瀏覽(30)
  • 198. 打家劫舍

    198. 打家劫舍

    198. 打家劫舍 https://leetcode.cn/problems/house-robber/description/

    2024年01月20日
    瀏覽(47)
  • 打家劫舍 III

    打家劫舍 III

    打家劫舍 III 如果 兩個(gè)直接相連的房子在同一天晚上被打劫 ,房屋將自動報(bào)警 返回 在不觸動警報(bào)的情況下 ,小偷能夠盜取的最高金額 記憶化 + 解決重復(fù)子問題解決本題,在任意一個(gè)位置,小偷可以選擇打劫該房屋和不打劫該房屋,如果打劫,則不能打劫該節(jié)點(diǎn)下的子節(jié)點(diǎn)

    2024年02月09日
    瀏覽(14)
  • 53 打家劫舍

    53 打家劫舍

    !經(jīng)典DP! 你是一個(gè)專業(yè)的小偷,計(jì)劃偷竊沿街的房屋。每間房內(nèi)都藏有一定的現(xiàn)金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統(tǒng),如果 兩間相鄰的房屋在同一晚上被小偷闖入,系統(tǒng)會自動報(bào)警 。 給定一個(gè)代表每個(gè)房屋存放金額的非負(fù)整數(shù)數(shù)組,計(jì)

    2024年02月07日
    瀏覽(15)
  • LC198. 打家劫舍

    ?代碼隨想錄

    2024年01月21日
    瀏覽(32)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包