日韩性视频-久久久蜜桃-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精品成人片三人毛片 | 欧美天天色 | 国产偷拍一区二区三区 | 亚洲二区在线观看 | 黑人玩弄人妻一区二区三区影院 | 亚洲精品国偷拍自产在线观看蜜桃 | 少妇免费毛片久久久久久久久 | 欧美超碰在线 | 欧美区在线 | 免费看成人片 | 91欧美激情一区二区三区成人 | 国产精品宾馆在线精品酒店 | 美国一级片网站 | 蜜桃视频在线观看一区二区 | 天天干天天操天天拍 | 中日韩av电影 | 大学生高潮无套内谢视频 | 欧美精品一二三四 | 国产激情精品一区二区三区 | 成人h动漫精品一区二区 | 欧洲av一区 | 夜夜天堂 | 欧美粗大猛烈老熟妇 | 色中色综合网 | 亚洲天堂网址 | 人体内射精一区二区三区 | 黑人巨大xxxxx性猛交 | 国产又黄又大又粗视频 | 精品久久精品 | 91精产品一区观看 | 久久97| 国产精品高潮呻吟久久av黑人 | www.日本精品 | 一级人爱视频 | 日韩网站免费观看 | 九九久久网 | jiizzyou性欧美老片 | 香蕉尹人| 国产成人欧美一区二区三区的 | 亚洲1234区| 日韩一区免费视频 | 成年人网站在线观看视频 | 日本特黄一级片 | 鲁丝一区二区 | 成人免费黄色小视频 | 色婷婷久久五月综合成人 | av日韩国产 | 久久在现 | 91尤物视频在线观看 | 欧美乱码精品一区二区三区 | 内射一区二区 | 天堂av资源网 | 亚洲精品久久久久久久蜜桃臀 | 91好色先生| 美女户外露出 | 亚洲一区二区三区在线免费观看 | 欧美一级在线视频 | 午夜剧场免费看 | 伊人久久精品一区二区三区 | 四季av在线一区二区三区 | 精品国自产在线观看 | 一级黄色欧美 | 欧美黑吊大战白妞 | 国产精品自拍小视频 | 精品无码人妻少妇久久久久久 | 午夜视频一区二区 | 精品视频一二区 | 欧美午夜精品一区二区 | 欧美嫩草影院 | 美女作爱网站 | 最新国产拍偷乱偷精品 | 88av.com | 亚洲最大在线视频 | 一区二区不卡视频 | 亚洲制服丝袜一区 | 成人免费av | 午夜成人鲁丝片午夜精品 | 欧美色激情 | 午夜寻花 | 韩国av免费在线 | 午夜大片| 大地av| 91麻豆成人精品国产 | 久操精品在线 | 99国产精品一区二区 | 少妇在线| jizz欧洲 | 一本色道久久加勒比精品 | 国产欧美日韩综合精品一区二区三区 | 久久综合鬼色 | 你懂的网址在线观看 | 成人黄色三级 | 欧美日本中文字幕 | 久久国产毛片 | 在线观看色网站 | 国产日韩精品中文字无码 | 91精品视频一区二区三区 | 黄色免费在线网址 | 欧美视频在线一区 |