[Leedcode][JAVA][第198题][打家劫舍][动态规划]
【問題描述】[簡單]
你是一個專業的小偷,計劃偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定一個代表每個房屋存放金額的非負整數數組,計算你 不觸動警報裝置的情況下 ,一夜之內能夠偷竊到的最高金額。示例 1:輸入: [1,2,3,1] 輸出: 4 解釋: 偷竊 1 號房屋 (金額 = 1) ,然后偷竊 3 號房屋 (金額 = 3)。偷竊到的最高金額 = 1 + 3 = 4 。【解答思路】
1. 動態規劃
第 1 步:設計狀態
int[] dp = new int[len + 1];
第 2 步:狀態轉移方程
dp[n] = MAX( dp[n-1], dp[n-2] + num )
第 3 步:考慮初始化
dp[0] = 0;
dp[1] = nums[0];
第 4 步:考慮輸出
dp[len]
第 5 步:考慮是否可以狀態壓縮
方法2
時間復雜度:O(N) 空間復雜度:O(N)
與上面方法略有不同
class Solution {public int rob(int[] nums) {int n = nums.length;// 處理邊界條件。if (n == 0) {return 0;}if (n == 1) {return nums[0];}// 定義dp數組,按照狀態轉移方程遞推。int[] dp = new int[n];dp[0] = nums[0];dp[1] = Math.max(nums[0], nums[1]);for (int i = 2; i < n; i++) {dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i]);}return dp[n - 1];} }2. 動態規劃壓縮空間
參照著 dp[i] = max(dp[i - 1], dp[i - 2] + nums[i]) 這個方程來寫,
用 a 表示 i - 2,b 表示 i - 1,
因此上面的方程變成了dp[i] = max(b, a + nums[i]),
然后下一輪循環的時候:
i - 1 就變成了i - 2,因此現在需要把 b 賦值給 a;
i 就變成了 i - 1,因此現在需要把 dp[i] 賦值給 b。
時間復雜度:O(N) 空間復雜度:O(1)
class Solution {public int rob(int[] nums) {int a = 0, b = 0;for (int i = 0; i < nums.length; i++) {int c = Math.max(b, a + nums[i]);a = b;b = c;}return b;} }【總結】
1.dp數組設置多一個 在前面添加后者后面添加
int[] dp = new int[len + 1];
2.動態規劃流程
第 1 步:設計狀態
第 2 步:狀態轉移方程
第 3 步:考慮初始化
第 4 步:考慮輸出
第 5 步:考慮是否可以狀態壓縮
3.動態規劃做多了 第一次自己寫了出來,可惜初始化沒有想全面
轉載鏈接:https://leetcode-cn.com/problems/house-robber/solution/liang-ge-yue-0ji-chu-cong-an-mo-shi-zhuan-xing-zi-/
總結
以上是生活随笔為你收集整理的[Leedcode][JAVA][第198题][打家劫舍][动态规划]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 万能地图下载器标绘线的参数说明
- 下一篇: 《交互式程序设计 第2版》一3.6 关系