日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【LeetCode】LeetCode之打家劫舍【暴力递归、动态规划、动态规划之优化空间的具体分析与实现】

發(fā)布時間:2024/10/5 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【LeetCode】LeetCode之打家劫舍【暴力递归、动态规划、动态规划之优化空间的具体分析与实现】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

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

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

提示:

  • 1 <= nums.length <= 100
  • 0 <= nums[i] <= 400

📕1.暴力解法-遞歸實現(xiàn)

使用遞歸解題首先想到的肯定是如何推導出遞推公式,也就是如何分解成一個個的子問題。如果你在腦子里遞來遞去的,那樣就陷入了一個誤區(qū),很容易思維混亂。遞歸最最重要的是推導出遞推公式即可,至于怎么遞來遞去的交給計算機

🧿(1)當nums.length=1時,那肯定最高金額就是nums[0]
🧿(2)當nums.lenght=2時,最高金額要么是nums[0]要么是nums[1]
🧿(3)當nums.length=3時,此時最高金額要么是nums[0]+nums[2]要么是nums[1],也就是max(nums[0]+nums[2],nums[1]);

🧿(4)當nums.length=n時,此時最高金額就是max(nums[n-1],nums[n-2]+nums[n]);

你會發(fā)現(xiàn)當我們求nums.length=n的最大金額時相當于對上述過程進行倒推,此時遞推公式就出來了。

遞歸中第二個比較重要的是找出終止條件

🛑由于我們遞推公式里包含nums[n-1]與nums[n-2],所以為了防止數(shù)組越界,終止條件就是當n==1 || n ==2時。

代碼實現(xiàn):

public static int rob(int[] nums) { if (nums.length == 1) {//如果length=1,那么最大值肯定就是nums[0]return nums[0];}//由于我們的終止條件是當n==0||n==1時//當遞歸從n到1時就要回溯了,此時就得考慮當n=1時,nums[1]是最大金額而不是nums[0],所以有種情況對應下面的解釋nums[1] = Math.max(nums[0], nums[1]);return recursion(nums.length - 1, nums);}public static int recursion(int n, int[] nums) {if (n == 0 || n == 1) {return nums[n];//這里終止條件直接返回的是nums[n],代表此時n的最大金額//如果n=1,那么你能否確定nums[1]是最大金額而不是nums[0]呢//我們在rob方法體內(nèi)要進行判斷,如果nums[0]>nums[1],要將nums[0]賦值給nums[1]}return Math.max(recursion(n - 1, nums), recursion(n - 2, nums) + nums[n]);}


從上圖我們可以看出使用遞歸出現(xiàn)了大量的重復計算(我只是枚舉前三行,越往后重復越多),這是遞歸比較忌諱的問題之一(重復和棧溢出)。這樣無異于在浪費CPU的運算單元。

復雜度分析:
空間復雜度:O(n)【每個棧空間復雜度為O(1)】O(n*1)=O(n)
時間復雜度:O(n^n)

  • 遞歸算法的空間復雜度與所生成的最大遞歸樹的深度成正比。如果遞歸算法的每個函數(shù)調(diào)用都占用 O(m) 空間,并且如果遞歸樹的最大深度為 n,則遞歸算法的空間復雜度將為 O(n·m)。”

當我使用暴力解法提交到LeetCode時,可以看出超時了,這種方式解題肯定不行。

💌上述中遞歸解題方式的缺點就是重復量比較多,所以我們可以可以將途中計算的結(jié)果保存下來,俗稱記憶集或記憶化搜索。此時你應該想到這不正是動態(tài)規(guī)劃嘛。

2.記憶化搜索-動態(tài)規(guī)劃

如果你懂得了上述中的遞歸,那么理解動態(tài)規(guī)劃解題應該比較容易,首先要根據(jù)動態(tài)規(guī)劃的解題步驟進行分析

(1)分解為子問題,這個上述遞歸已經(jīng)分析過
(2)確定狀態(tài)
(3)推導轉(zhuǎn)移方程,這個上述遞歸的遞推式
(4)尋找邊界條件,也就是上述遞歸中的終止條件

上述四個步驟,除了第二個我們都已經(jīng)在上述遞歸中分析出來了,這個確定狀態(tài)也就是用什么來保存遍歷過程中的值,此題當然最適合使用一維數(shù)組進行保存
【比如dp[0]代表n=1時的最大金額;dp[1]代表n=2時的最大金額;dp[2]代表n=3時的最大金額,也就是dp[2]=max(dp[0]+nums[2],dp[1]),可以看出max中的dp[0]與dp[1]已經(jīng)被記錄下來了。那么一旦到dp[n]它的最大金額就可以根據(jù)前面的最優(yōu)結(jié)果進行求解。

動態(tài)規(guī)劃一般都是通過迭代完成的,而不是遞歸。動態(tài)規(guī)劃=迭代+記憶集

🎩代碼實現(xiàn)

public static int rob(int[] nums) {if (nums.length == 1) {return nums[0];}int[] dp = new int[nums.length];//創(chuàng)建一個dp數(shù)組dp[0] = nums[0];//0和1都要先確定下來,因為下面遍歷時包含i-2dp[1] = Math.max(nums[0], nums[1]);for (int i = 2; i < nums.length; i++) {dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i]);}return dp[nums.length - 1];}

復雜度分析

空間復雜度為O(n)
時間復雜度為O(n)

當我提交LeetCode上時,可以發(fā)現(xiàn)通過了。

分析一下:能不能將空間復雜度優(yōu)化成O(1)呢?

3.動態(tài)規(guī)劃之優(yōu)化空間復雜度

優(yōu)化成O(1),那肯肯定就是使用0維數(shù)組作為記憶集了,經(jīng)分析會發(fā)現(xiàn)每個結(jié)果只會被調(diào)用一次而且是有順序性的。
比如遍歷到i=4時,求maxMoney=max(nums[i-1],nums[i-2]+nums[i]);當用完一次nums[i-1]或者nums[i-2]時后續(xù)就不會再使用

使用pre保存當n-2時的最大金額
使用suf保存當n-1時的最大金額

public static int rob2(int[] nums) {if (nums.length == 1) {return nums[0];}int pre = nums[0];int suf = Math.max(nums[0], nums[1]);int maxMoney = suf;for (int i = 2; i < nums.length; i++) {maxMoney = Math.max(pre + nums[i], suf);pre = suf;suf = maxMoney;}return maxMoney;}

復雜度分析

時間復雜度:O(n)
空間復雜度:O(1)

提交到LeetCode,當然能通過

總結(jié)

以上是生活随笔為你收集整理的【LeetCode】LeetCode之打家劫舍【暴力递归、动态规划、动态规划之优化空间的具体分析与实现】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 在线观看黄色片 | 精品一区二区毛片 | 少妇激情视频 | 99久久精品无免国产免费 | 看个毛片| 一区二区三区小说 | www.日日夜夜 | 一区二区三区爱爱 | 免费看一区二区三区 | 午夜精品久久久久久久99热浪潮 | 男人添女人下部高潮视频 | 国产精品女同 | 91看大片| 中文幕无线码中文字蜜桃 | 性欧美视频在线观看 | 久久久久国产精品区片区无码 | 中国精品一区二区 | 日韩一区二区三区中文字幕 | 精品久久久久久久中文字幕 | 免费网站www在线观看 | 久久怡红院 | 亚洲无人区码一码二码三码 | 色香影院 | 女人的洗澡毛片毛多 | 二区中文字幕 | 九九综合 | 疯狂撞击丝袜人妻 | 1024手机看片国产 | 豆豆色成人网 | 91国偷自产一区二区三区观看 | 亚洲精品国产乱伦 | 青青草精品视频 | 禁漫天堂免费网站 | 亚洲欧美婷婷 | 亚洲首页 | 国模精品视频 | 台湾佬在线 | 午夜精品福利电影 | 在线观看日本视频 | 中文在线字幕免费观看电 | 好吊妞精品视频 | 美女视频黄色 | av88av | 国产在线你懂得 | 天天做天天爱夜夜爽 | 91漂亮少妇露脸在线播放 | 天天舔天天操天天干 | 国产免费片 | 国产免费无码一区二区 | 国产探花视频在线观看 | www.国产在线观看 | 天堂va蜜桃一区 | 日本aa在线观看 | 黄色国产视频网站 | 亚洲熟区 | 男人操女人的网站 | 玖玖热视频 | 色多多视频网站 | 老头把女人躁得呻吟 | 少妇在线 | 日韩午夜三级 | 久久久久久夜 | 成人免费va视频 | 手机在线一区二区 | 2018自拍偷拍 | 国产ts变态重口人妖hd | 久久11| 麻豆91茄子在线观看 | 在线欧美激情 | 午夜狠狠干 | 熟女自拍一区 | 黄在线观看免费 | 97人妻精品一区二区三区动漫 | 91人妻一区二区三区 | 久久99精品久久久久久 | 国产丝袜在线播放 | 日日射夜夜 | 久久久久久久久久一区 | 国模一区二区 | 黄色免费入口 | 欧美资源站| 91精选| 人人妻人人爽一区二区三区 | va在线播放 | japanese在线观看 | 非洲黑寡妇性猛交视频 | 在线视频 中文字幕 | 羞羞网站在线看 | 国模av在线| 一级少妇毛片 | 视频在线a | 91精品免费在线 | 深夜影院深a | 久久久久a | 欧美日韩在线网站 | 日本一二三区不卡 | 欧美激情久久久久久 | 国模吧一区二区三区 | 97人妻精品一区二区 |