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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【LeetCode】LeetCode之打家劫舍Ⅱ——暴力递归+动态规划解决循环问题+DP空间优化

發布時間:2024/10/5 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【LeetCode】LeetCode之打家劫舍Ⅱ——暴力递归+动态规划解决循环问题+DP空间优化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這道題和第 198 題相似,建議讀者首先閱讀「198. 打家劫舍」

🔒LeetCode之打家劫舍ⅠLeetCode之打家劫舍Ⅰ


1.打家劫舍II 題目描述

你是一個專業的小偷,計劃偷竊沿街的房屋,每間房內都藏有一定的現金。這個地方所有的房屋都 圍成一圈 ,這意味著第一個房屋和最后一個房屋是緊挨著的。同時,相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警 。

給定一個代表每個房屋存放金額的非負整數數組,計算你 在不觸動警報裝置的情況下 ,今晚能夠偷竊到的最高金額。

💎示例 1:

輸入:nums = [2,3,2]
輸出:3
解釋:你不能先偷竊 1 號房屋(金額 = 2),然后偷竊 3 號房屋(金額 = 2), 因為他們是相鄰的。

💎示例 2:

輸入:nums = [1,2,3,1]
輸出:4
解釋:你可以先偷竊 1 號房屋(金額 = 1),然后偷竊 3 號房屋(金額 = 3)。
偷竊到的最高金額 = 1 + 3 = 4 。

💎示例 3:

輸入:nums = [0]
輸出:0

📜提示:

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

2.打家劫舍Ⅱ思路分析

🔗直達打家劫舍①鏈接,默認讀者已經搞懂了打家劫舍①.

該問題是在打家劫舍①的基礎上,添加了一個循環結構。如果你已經理解了打家劫舍①,那么這個Ⅱ只需要考慮怎么解決這個循環問題即可,也就是第一個數據和最后一個數據不能同時出現,要么最大金額只包含第一個數據,要么只包含最后一個數據。

所以我們可以將數組分為兩部分,各自找出每一部分的最大金額,然后返回它們兩個金額最大的即可【你會發現這樣分為兩部分之后,就不會出現第一個和最后一個數據同時出現的問題了;然后每一部分的解題過程就和打家劫舍1一模一樣了。


3.暴力解法-遞歸實現

📕流程

(1)將數組分為兩部分即可

  • 0 ~ n - 1
  • 1 ~ n

(2)然后將每一部分按照打家劫舍Ⅰ求解即可
(3)返回這兩部分結果的最大值

public int rob(int[] nums) {int l = nums.length;if (l == 1) {return nums[0];}if (l == 2) {return Math.max(nums[0], nums[1]);}int[] preNums = new int[l - 1];int[] sufNums = new int[l - 1];for (int i = 0; i < l - 1; i++) {preNums[i] = nums[i];if (i > 0) {sufNums[i - 1] = nums[i];}}sufNums[l - 2] = nums[l - 1];//以上代碼是將數組分為兩個子數組【1~n,0~n-1】preNums[1] = Math.max(preNums[0], preNums[1]);sufNums[1] = Math.max(sufNums[0], sufNums[1]);//以上兩行與打家劫舍1類似return Math.max(recursion(preNums.length - 1, preNums), recursion(sufNums.length - 1, sufNums));}public int recursion(int n, int[] nums) {if (n == 0 || n == 1) {return nums[n];}return Math.max(recursion(n - 1, nums), recursion(n - 2, nums) + nums[n]);}

當我將該暴力解法提交到LeetCode,發現會超時。


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

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

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

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


4.記憶化搜索-動態規劃

需要兩個dp數組進行保存,因為在抽象層面分為兩個數組了嘛,所以要使用兩個記憶集。其他就和打家劫舍1一樣了。

循環體內部包含兩部分

  • 0 ~ n-1
  • 1 ~ n
public int rob2(int[] nums) {if (nums.length == 1) {return nums[0];}if (nums.length == 2) {return Math.max(nums[0], nums[1]);}int[] dp1 = new int[nums.length - 1];dp1[0] = nums[0];dp1[1] = Math.max(nums[0], nums[1]);int[] dp2 = new int[nums.length - 1];dp2[0] = nums[1];dp2[1] = Math.max(nums[1], nums[2]);for (int i = 2; i < nums.length - 1; i++) {//0~n-1dp1[i] = Math.max(dp1[i - 1], dp1[i - 2] + nums[i]);//1~ndp2[i] = Math.max(dp2[i - 1], dp2[i - 2] + nums[i + 1]);}return Math.max(dp1[nums.length - 2], dp2[nums.length - 2]);}

復雜度分析

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

當我提交LeetCode上時,可以發現通過了。
分析一下:能不能將空間復雜度優化成O(1)呢?


5.動態規劃之優化空間復雜度

如果理解了打家劫舍1和前面的流程,這個應該很簡單。

public int rob3(int[] nums) {if (nums.length == 1) {return nums[0];}if (nums.length == 2) {return Math.max(nums[0], nums[1]);}int pre1 = nums[0], pre2 = nums[1];int suf1 = Math.max(nums[0], nums[1]);int suf2 = Math.max(nums[1], nums[2]);int maxMoney1 = suf1;int maxMoney2 = suf2;for (int i = 2; i < nums.length - 1; i++) {maxMoney1 = Math.max(pre1 + nums[i], suf1);pre1 = suf1;suf1 = maxMoney1;maxMoney2 = Math.max(pre2 + nums[i + 1], suf2);pre2 = suf2;suf2 = maxMoney2;}return Math.max(maxMoney1, maxMoney2);}

復雜度分析

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

提交到LeetCode,當然能通過


總結

以上是生活随笔為你收集整理的【LeetCode】LeetCode之打家劫舍Ⅱ——暴力递归+动态规划解决循环问题+DP空间优化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美不卡一区 | 国产粉嫩一区二区三区 | 精品国产一区二区三区久久久久久 | 国产欧美在线看 | 人人妻人人澡人人爽人人欧美一区 | 国产激情对白 | 丰满少妇久久久久久久 | chinese麻豆新拍video | 日韩伦理一区二区 | 少妇一边呻吟一边说使劲视频 | 91在线精品秘密一区二区 | 欧美一区2区 | 国产精品亚洲AV色欲三区不卡 | 99在线观看 | 清冷男神被c的合不拢腿男男 | 欧美激情aaa | 全部免费毛片在线播放 | 久久精品视频一区二区 | 蜜臀人妻四季av一区二区不卡 | 尤物网站在线观看 | 日韩一区2区 | 美女一二三区 | 五月天激情综合 | 男女羞羞的视频 | 荫蒂被男人添免费视频 | 中文字幕日本在线观看 | 国产色网 | 亚洲一区二区国产 | 亚洲一二三不卡 | 瑟瑟视频免费观看 | 国产一区二区三区四区 | av十大美巨乳| 色婷婷av一区二区三区软件 | 一区二区中文字幕在线观看 | 国产乱淫av片免费看 | 国产精品偷乱一区二区三区 | 91一区二区三区四区 | 人乳喂奶hd无中字 | 午夜福利电影一区二区 | 男受被做哭激烈娇喘gv视频 | 伊人精品一区二区三区 | 四虎精品| 色视频在线观看免费 | 精品国产一二三区 | 国产性猛交xxxⅹ交酡全过程 | 国产激情一区 | 韩国视频一区二区三区 | 免费三片在线观看网站v888 | 女王脚交玉足榨精调教 | 日本三级久久 | 精品人妻一区二区三区蜜桃视频 | 久久视频在线免费观看 | 成人激情片 | 欧美色第一页 | 日本黄色免费网址 | 成人精品一区日本无码网 | 黄色片成人 | 九九热精品视频 | 色中文字幕 | 黄色在线免费观看视频 | 扒开伸进免费视频 | 欧美少妇诱惑 | 日韩欧美亚洲综合 | 福利在线观看 | 国产粉嫩在线观看 | 毛片在线视频观看 | 精品久久91 | 超级碰在线观看 | www日日日| 色狠久 | 男女无遮挡网站 | 五月婷视频| 先锋av网| 永久免费黄色 | 成人在线激情 | 玖草在线 | 五月天丁香 | 日韩欧美一区二区三区四区五区 | av88av| 灌满闺乖女h高h调教尿h | 日韩激情影院 | 一本久道综合色婷婷五月 | 久久精品女人毛片国产 | 午夜精品久久久久久99热 | 福利国产在线 | 超碰97免费在线 | 久久久久无码国产精品一区李宗瑞 | 国产精品一区二区三区在线播放 | 欧美成人三级在线视频 | 伊人久久成人 | 国产一区二区三区四区 | 奇米第四色首页 | 最新中文字幕在线播放 | 国产一区第一页 | 免费午夜视频在线观看 | 99r在线视频 | 日韩jizz| 国产丰满果冻videossex | 久久精品国产亚洲av麻豆色欲 |