生活随笔
收集整理的這篇文章主要介紹了
【LeetCode笔记】213. 打家劫舍II(Java、动态规划)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
題目描述
思路 & 代碼
- 由題意可知:一種路線中,不能同時出現第一家和最后一家。
- 那么好辦了,直接分成兩部分分別取:不包含第一家的部分、不包含最后一家的部分
- 時間復雜度 O(n),空間復雜度 O(n)
class Solution {public int rob(int[] nums
) {if(nums
.length
== 1){return nums
[0];}return Math.max(forRob(nums
, 0, nums
.length
- 2), forRob(nums
, 1, nums
.length
- 1));}int forRob(int[] nums
, int left
, int right
){if(right
- left
== 0){return nums
[left
];}if(right
- left
== 1){return Math.max(nums
[left
], nums
[right
]);}int[] dp
= new int[right
- left
+ 1];dp
[0] = nums
[left
];dp
[1] = nums
[left
+ 1];dp
[2] = nums
[left
] + nums
[left
+ 2];for(int i
= 3; i
< right
- left
+ 1; i
++){dp
[i
] = nums
[left
+ i
] + Math.max(dp
[i
- 2], dp
[i
- 3]);}return Math.max(dp
[right
- left
], dp
[right
- left
- 1]);}
}
更新版
- 注意三個邊界判斷
- 更改了思路,當前 dp[i] = 此時可取到的最大值,不一定要取 nums[i]
class Solution {public int rob(int[] nums
) {if(nums
.length
== 1) {return nums
[0];}return Math.max(rob1(nums
, 0, nums
.length
- 2), rob1(nums
, 1, nums
.length
- 1));}public int rob1(int[] nums
, int left
, int right
) {if(left
== right
) {return nums
[left
];}if(left
+ 1 == right
) {return Math.max(nums
[left
], nums
[right
]);}int[] dp
= new int[nums
.length
- 1];dp
[0] = nums
[left
];dp
[1] = Math.max(nums
[left
], nums
[left
+ 1]);for(int i
= 2; i
< dp
.length
; i
++) {dp
[i
] = Math.max(dp
[i
- 2] + nums
[left
+ i
], dp
[i
- 1]);}return dp
[dp
.length
- 1];}
}
總結
以上是生活随笔為你收集整理的【LeetCode笔记】213. 打家劫舍II(Java、动态规划)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。