leetcode 213. House Robber II | 213. 打家劫舍 II(Java)
生活随笔
收集整理的這篇文章主要介紹了
leetcode 213. House Robber II | 213. 打家劫舍 II(Java)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目
https://leetcode.com/problems/house-robber-ii/
題解
這道題是「198. 打家劫舍」的進(jìn)階,和第 198 題的不同之處是,這道題中的房屋是首尾相連的,第一間房屋和最后一間房屋相鄰,因此第一間房屋和最后一間房屋不能在同一晚上偷竊。
和第 198 題相似,這道題也可以使用動(dòng)態(tài)規(guī)劃解決。建議讀者首先閱讀 leetcode 198. 打家劫舍(最簡單的動(dòng)態(tài)規(guī)劃問題),了解動(dòng)態(tài)規(guī)劃的思想。
由于本題 首尾相連,所以需要注意的是,首尾不能同時(shí)偷。
思路是,對(duì) 是否選擇首元素 進(jìn)行分類討論,分別計(jì)算可以偷竊到的最高總金額,其中的最大值即為在 n 間房屋中可以偷竊到的最高總金額。
class Solution {public int rob(int[] nums) {int len = nums.length;int[] dp1 = new int[len];int[] dp2 = new int[len];if (len == 1) return nums[0];if (len == 2) return Math.max(nums[0], nums[1]);// dp1 允許選首元素dp1[0] = nums[0];dp1[1] = Math.max(nums[0], nums[1]);for (int i = 2; i < len; i++) {dp1[i] = Math.max(dp1[i - 1], dp1[i - 2] + nums[i]);}// 如果同時(shí)選了首尾元素 此時(shí)dp1的最大值要?jiǎng)h掉尾元素(刪掉首元素的情況被包含在dp2中來討論)// else 說明沒有同時(shí)選首尾元素 此時(shí)dp1最大值不變if (dp1[len - 1] > dp2[len - 1] && dp1[len - 1] == dp1[len - 3] + nums[len - 1]) dp1[len - 1] = dp1[len - 2];// dp2 強(qiáng)制不選首元素dp2[0] = 0;dp2[1] = nums[1];for (int i = 2; i < len; i++) {dp2[i] = Math.max(dp2[i - 1], dp2[i - 2] + nums[i]);}return Math.max(dp1[len - 1], dp2[len - 1]);} }總結(jié)
以上是生活随笔為你收集整理的leetcode 213. House Robber II | 213. 打家劫舍 II(Java)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: leetcode 211. Design
- 下一篇: leetcode 215. Kth La