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

【力扣刷題 | 第十六題】

這篇具有很好參考價(jià)值的文章主要介紹了【力扣刷題 | 第十六題】。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

【力扣刷題 | 第十六題】,【力扣刷題】,leetcode,數(shù)學(xué)建模,算法,c++,開發(fā)語言

目錄

前言:

198. 打家劫舍 - 力扣(LeetCode)

213. 打家劫舍 II - 力扣(LeetCode)

?總結(jié):


前言:

我們今天繼續(xù)刷動(dòng)態(tài)規(guī)劃的題,希望大家可以和我一起堅(jiān)持下去。

198. 打家劫舍 - 力扣(LeetCode)

你是一個(gè)專業(yè)的小偷,計(jì)劃偷竊沿街的房屋。每間房內(nèi)都藏有一定的現(xiàn)金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統(tǒng),如果兩間相鄰的房屋在同一晚上被小偷闖入,系統(tǒng)會(huì)自動(dòng)報(bào)警。

給定一個(gè)代表每個(gè)房屋存放金額的非負(fù)整數(shù)數(shù)組,計(jì)算你 不觸動(dòng)警報(bào)裝置的情況下 ,一夜之內(nèi)能夠偷竊到的最高金額。

【力扣刷題 | 第十六題】,【力扣刷題】,leetcode,數(shù)學(xué)建模,算法,c++,開發(fā)語言

?解題思路:我們要先快速確定出這道題的解題方向,我們讀題后發(fā)現(xiàn):當(dāng)前房間偷不偷,取決于它前一個(gè)房間有沒有被偷,因此可以確定出房間之間是存在這樣一個(gè)遞推關(guān)系的,因此我們確定了動(dòng)態(tài)規(guī)劃的思路,既然是動(dòng)態(tài)規(guī)劃,我們就嚴(yán)格按照動(dòng)態(tài)規(guī)劃五步走:

1.確定dp數(shù)組的含義以及下標(biāo)的含義dp[i]表示包含這個(gè)房間他所能偷盜的最大金幣的總和。

2.遞推公式:我們用圖片舉例,假設(shè)此時(shí)我們要判斷到最后一個(gè)房間的時(shí)候最大的金幣數(shù)

其實(shí)就兩個(gè)狀態(tài)我們分類討論:

1.偷最后一個(gè)房間:【力扣刷題 | 第十六題】,【力扣刷題】,leetcode,數(shù)學(xué)建模,算法,c++,開發(fā)語言

?既然5房間決定要偷了,那么4房間一定不偷,那么此時(shí)能夠獲得到的最大金幣dp[5]其實(shí)就等于nums[5]+dp[3]。我們要理解正確理解dp數(shù)組的含義,才可以理解這個(gè)公式。

我們這里的下標(biāo)只是為了方便理解,實(shí)際上我們?cè)跇?gòu)建的時(shí)候,dp數(shù)組是從0開始的,也就是說dp[0]就是第一次房間能夠偷到的最大金幣數(shù)。

2.不偷最后一個(gè)房間:
【力扣刷題 | 第十六題】,【力扣刷題】,leetcode,數(shù)學(xué)建模,算法,c++,開發(fā)語言

?既然5房間不偷,那么此時(shí)能夠得到的最大金幣 dp[5 ]= dp[4],此時(shí)我們的問題就又回到了對(duì)dp[4]進(jìn)行討論,也就是對(duì)4號(hào)房間再次進(jìn)行偷與不偷的討論。

經(jīng)過這個(gè)講解,相信大家其實(shí)對(duì)打家劫舍問題的遞推思路已經(jīng)清晰:我們每一次比較這個(gè)這個(gè)房間偷與不偷所得到的金幣數(shù)量,選擇較大的作為dp數(shù)組的元素,這樣不斷遞推,最后返回最后一個(gè)房間對(duì)應(yīng)的dp數(shù)組的元素。

公式為:?dp[i]=max(nums[i]+dp[i-2],dp[i-1]);

?3.dp數(shù)組的初始化:我們根據(jù)遞推公式就可以知道只需要初始化dp[0]與dp[1]的值就好了。其實(shí)二者的初始化很好理解:
????????dp[0]:從頭開始包含第一個(gè)房間的最大金幣數(shù),那么當(dāng)前只有一個(gè)房間,要想得到最大金幣數(shù)就必須偷這個(gè)房間,那就是dp[0]=nums[0]。

????????dp[1]:從頭開始到第二間房間的最大金幣數(shù),因?yàn)槲覀儾荒芡迪噜彽膬蓚€(gè)房間,那么想要得到最大的金幣數(shù),就只能偷1或者偷2,選擇最大的偷。那么就是dp[1]=max(dp[0],dp[1])。

4.遍歷順序:根據(jù)公式可得是從前往后推,遍歷順序自然也是從前往后。

經(jīng)過我們?cè)敿?xì)的分析,代碼的框架其實(shí)就已經(jīng)搭建起來了,我們要做的只剩下補(bǔ)全這個(gè)框架。

class Solution {
public:
    int rob(vector<int>& nums) {
        if(nums.size()==1)
        {
            return nums[0];
        }
        else if(nums.size()==2)
        {
            return max(nums[0],nums[1]);
        }
       vector<int>dp(nums.size());
       dp[0]=nums[0];
       dp[1]=max(nums[0],nums[1]);
       for(int i=2;i<nums.size();i++)
       {
           dp[i]=max(nums[i]+dp[i-2],dp[i-1]);
       }       
       return dp[nums.size()-1];
    }
};

213. 打家劫舍 II - 力扣(LeetCode)

你是一個(gè)專業(yè)的小偷,計(jì)劃偷竊沿街的房屋,每間房內(nèi)都藏有一定的現(xiàn)金。這個(gè)地方所有的房屋都 圍成一圈 ,這意味著第一個(gè)房屋和最后一個(gè)房屋是緊挨著的。同時(shí),相鄰的房屋裝有相互連通的防盜系統(tǒng),如果兩間相鄰的房屋在同一晚上被小偷闖入,系統(tǒng)會(huì)自動(dòng)報(bào)警 。

給定一個(gè)代表每個(gè)房屋存放金額的非負(fù)整數(shù)數(shù)組,計(jì)算你 在不觸動(dòng)警報(bào)裝置的情況下 ,今晚能夠偷竊到的最高金額。

【力扣刷題 | 第十六題】,【力扣刷題】,leetcode,數(shù)學(xué)建模,算法,c++,開發(fā)語言

?其實(shí)這道題就是把改變了房間結(jié)構(gòu),讓首尾相連,房間結(jié)構(gòu)從線性變?yōu)榱谁h(huán)形。

【力扣刷題 | 第十六題】,【力扣刷題】,leetcode,數(shù)學(xué)建模,算法,c++,開發(fā)語言其實(shí)就是分類討論:

因?yàn)榇藭r(shí)首尾元素相連,因此我們?cè)谶x擇的時(shí)候只有兩種可能:

1.一定不偷尾。

2.一定不偷首。

【力扣刷題 | 第十六題】,【力扣刷題】,leetcode,數(shù)學(xué)建模,算法,c++,開發(fā)語言

?

在明確邏輯之后,代碼就非常明確了:

class Solution {
public:
    int rob(vector<int>& nums) {

        if (nums.size() == 0) 
        {
            return 0;
        }
        if (nums.size() == 1)
        { 
            return nums[0];
        }
        int result1 = getmax(nums, 0, nums.size() - 2); //不對(duì)首進(jìn)行考慮
        int result2 = getmax(nums, 1, nums.size() - 1); //不對(duì)尾進(jìn)行考慮
        return max(result1, result2);
    }
    
    int getmax(vector<int>& nums, int start, int end) {
        if (end == start) return nums[start];
        vector<int> dp(nums.size());
        dp[start] = nums[start];
        dp[start + 1] = max(nums[start], nums[start + 1]);
        for (int i = start + 2; i <= end; i++) {
            dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);
        }
        return dp[end];
    }
};    

我們對(duì)改動(dòng)做一下講解:該函數(shù)的目的是計(jì)算在[start,end]范圍內(nèi)選擇數(shù)字進(jìn)行相加得到的最大和,其中每個(gè)數(shù)字只能選擇一次。函數(shù)的實(shí)現(xiàn)過程如下:

1. 如果開始位置和結(jié)束位置相等,則直接返回?cái)?shù)組下標(biāo)為start的數(shù)字作為最大和。
2. 首先,我們定義一個(gè)大小與原始數(shù)組相同的dp數(shù)組,dp[i]表示在范圍[0,i]內(nèi)選擇數(shù)字得到的最大和。
3. 然后,我們初始化dp[0]為nums[0],dp[1]為max(nums[0], nums[1]),因?yàn)樵诘谝缓偷诙€(gè)位置的數(shù)字中選擇最大的那個(gè)能夠確保我們得到最大和。
4. 接下來,我們從第三個(gè)位置(即start+2)開始,循環(huán)遍歷整個(gè)數(shù)組。在每個(gè)位置i處,我們有兩種選擇:

  • 選擇當(dāng)前位置i的數(shù)字,這時(shí)最大和為dp[i-2]+nums[i];
  • 不選擇當(dāng)前位置i的數(shù)字,這時(shí)最大和為dp[i-1]。

5. 將兩種選擇的結(jié)果取max,更新dp[i]。
6. 最后,返回dp[end]作為[start,end]范圍內(nèi)選擇數(shù)字相加得到的最大和。

需要注意的是,該算法的時(shí)間復(fù)雜度為O(N),其中N為數(shù)組的長度。

?總結(jié):

? ? ? ? 打家劫舍類型題目里面給我們提供的這個(gè)算法思路真的很精彩,不愧是動(dòng)態(tài)規(guī)劃的經(jīng)典例題。

如果我的內(nèi)容對(duì)你有幫助,請(qǐng)點(diǎn)贊,評(píng)論,收藏。創(chuàng)作不易,大家的支持就是我堅(jiān)持下去的動(dòng)力!

【力扣刷題 | 第十六題】,【力扣刷題】,leetcode,數(shù)學(xué)建模,算法,c++,開發(fā)語言

?


?文章來源地址http://www.zghlxwxcb.cn/news/detail-606876.html

到了這里,關(guān)于【力扣刷題 | 第十六題】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • leetcode 力扣刷題 旋轉(zhuǎn)矩陣(循環(huán)過程邊界控制)

    leetcode 力扣刷題 旋轉(zhuǎn)矩陣(循環(huán)過程邊界控制)

    下面的題目的主要考察點(diǎn)都是,二維數(shù)組從左上角開始順時(shí)針(或者逆時(shí)針)按圈遍歷數(shù)組的過程。順時(shí)針按圈遍歷的過程如下: 對(duì)于每一圈,分為四條邊 ,循環(huán)遍歷就好。這時(shí),對(duì)于 四個(gè)角 的元素的處理,可以將四條邊的遍歷分為以下兩種情況: 第一種:每條邊都從對(duì)

    2024年02月12日
    瀏覽(21)
  • 【leetcode 力扣刷題】移除鏈表元素 多種解法

    【leetcode 力扣刷題】移除鏈表元素 多種解法

    題目鏈接:203.移除鏈表元素 題目內(nèi)容: 理解題意:就是單純的刪除鏈表中所有值等于給定的val的節(jié)點(diǎn)。上一篇博客中介紹了鏈表的基礎(chǔ)操作,在刪除鏈表中節(jié)點(diǎn)時(shí),需要注意的是頭節(jié)點(diǎn): 如果沒有虛擬頭節(jié)點(diǎn),那么對(duì)頭節(jié)點(diǎn)的刪除需要做不同的處理,head = head-next; 如果有

    2024年02月12日
    瀏覽(25)
  • 【leetcode 力扣刷題】鏈表基礎(chǔ)知識(shí) 基礎(chǔ)操作

    【leetcode 力扣刷題】鏈表基礎(chǔ)知識(shí) 基礎(chǔ)操作

    在數(shù)據(jù)結(jié)構(gòu)的學(xué)習(xí)過程中,我們知道線性表【一種數(shù)據(jù)組織、在內(nèi)存中存儲(chǔ)的形式】是線性結(jié)構(gòu)的,其中線性表包括順序表和鏈表。數(shù)組就是順序表,其各個(gè)元素在內(nèi)存中是連續(xù)存儲(chǔ)的。 鏈表則是由 數(shù)據(jù)域 和 指針域 組成的 結(jié)構(gòu)體 構(gòu)成的,數(shù)據(jù)域是一個(gè)節(jié)點(diǎn)的數(shù)據(jù),指針域

    2024年02月12日
    瀏覽(22)
  • 【leetcode 力扣刷題】回文串相關(guān)題目(KMP、動(dòng)態(tài)規(guī)劃)

    【leetcode 力扣刷題】回文串相關(guān)題目(KMP、動(dòng)態(tài)規(guī)劃)

    題目鏈接:5. 最長回文子串 題目內(nèi)容: 題目就是要我們找s中的回文子串,還要是最長的。其實(shí)想想,暴力求解也行……就是遍歷所有的子串,同時(shí)判斷是不是回文串,是的話再和記錄的最大長度maxlen比較,如果更長就更新。時(shí)間復(fù)雜度直接變成O(n^3)。 優(yōu)化的點(diǎn)在于,假設(shè)子

    2024年02月09日
    瀏覽(27)
  • 【leetcode 力扣刷題】字符串匹配之經(jīng)典的KMP?。?!

    【leetcode 力扣刷題】字符串匹配之經(jīng)典的KMP?。?!

    以下是能用KMP求解的算法題,KMP是用于字符串匹配的經(jīng)典算法【至今沒學(xué)懂………啊啊啊】 題目鏈接:28. 找出字符串中第一個(gè)匹配項(xiàng)的下標(biāo) 題目內(nèi)容: 題意還是很好理解的,要在字符串haystack中查找一個(gè)完整的needle,即字符串匹配。 暴力求解就是用 兩層循環(huán) :haystack從第

    2024年02月09日
    瀏覽(33)
  • 【leetcode 力扣刷題】字符串翻轉(zhuǎn)合集(全部反轉(zhuǎn)///部分反轉(zhuǎn))

    【leetcode 力扣刷題】字符串翻轉(zhuǎn)合集(全部反轉(zhuǎn)///部分反轉(zhuǎn))

    題目鏈接:344. 反轉(zhuǎn)字符串 題目內(nèi)容: 題目中重點(diǎn)強(qiáng)調(diào)了必須 原地修改 輸入數(shù)組,即不能新建一個(gè)數(shù)組來完成字符串的反轉(zhuǎn)。我們注意到: 原來下標(biāo)為0的,反轉(zhuǎn)后是size - 1【原來下標(biāo)是size - 1的,反轉(zhuǎn)后是0】; 原來下標(biāo)是1的,反轉(zhuǎn)后是size - 2【原來下標(biāo)是size -2的,反轉(zhuǎn)后

    2024年02月11日
    瀏覽(33)
  • 【leetcode 力扣刷題】數(shù)學(xué)題之除法:哈希表解決商的循環(huán)節(jié)?快速乘求解商

    【leetcode 力扣刷題】數(shù)學(xué)題之除法:哈希表解決商的循環(huán)節(jié)?快速乘求解商

    題目鏈接:166. 分?jǐn)?shù)到小數(shù) 題目內(nèi)容: 題目是要我們把一個(gè)分?jǐn)?shù)變成一個(gè)小數(shù),并以字符串的形式返回。按道理,直接將分子numerator除以分母denominator就得到了小數(shù),轉(zhuǎn)換成string返回就好。題目要求里指出了特殊情況—— 小數(shù)部分如果有循環(huán),就把循環(huán)節(jié)括在括號(hào)里 。 那么

    2024年02月10日
    瀏覽(21)
  • 力扣經(jīng)典150題第三十六題:旋轉(zhuǎn)圖像

    力扣經(jīng)典150題第三十六題:旋轉(zhuǎn)圖像

    本篇博客介紹了力扣經(jīng)典150題中的第三十六題:旋轉(zhuǎn)圖像。題目要求將給定的 n × n 二維矩陣順時(shí)針旋轉(zhuǎn)90度,并要求在原地進(jìn)行修改。 給定一個(gè) n × n 的二維矩陣 matrix 表示一個(gè)圖像。請(qǐng)你將圖像順時(shí)針旋轉(zhuǎn) 90 度。 示例 1: 輸入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 輸出:[[7,4,1],[8

    2024年04月28日
    瀏覽(24)
  • 力扣刷題 - 數(shù)組篇

    力扣刷題 - 數(shù)組篇

    https://leetcode.cn/problems/max-consecutive-ones/ 暴力解法: 定義一個(gè)變量來統(tǒng)計(jì)是否連續(xù) https://leetcode.cn/problems/teemo-attacking/ 暴力解法: 記錄每次中的開始時(shí)間與結(jié)束時(shí)間, 然后如果下一次中毒的是在結(jié)束時(shí)間之前, 就去更新開始時(shí)間(讓它加上這個(gè)持續(xù)時(shí)間減去結(jié)束時(shí)間),如果是在之后

    2024年02月16日
    瀏覽(22)
  • 【力扣刷題 | 第七天】

    【力扣刷題 | 第七天】

    今天我們將會(huì)進(jìn)入棧與隊(duì)列的刷題篇章,二者都是經(jīng)典的數(shù)據(jù)結(jié)構(gòu),熟練的掌握棧與隊(duì)列實(shí)現(xiàn)可以巧妙的解決有些問題。 請(qǐng)你僅使用兩個(gè)棧實(shí)現(xiàn)先入先出隊(duì)列。隊(duì)列應(yīng)當(dāng)支持一般隊(duì)列支持的所有操作(push、pop、peek、empty): 實(shí)現(xiàn) MyQueue 類: void push(int x) 將元素 x 推到隊(duì)列的

    2024年02月09日
    瀏覽(26)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包