題目鏈接
LeetCode 213. 打家劫舍 II[1]
往期回顧:打家劫舍 I :
【每日算法Day 104】偷電瓶的周某今天放出來了,還不趕緊做這道題防範一下![2]
題目描述
你是一個專業的小偷,計劃偷竊沿街的房屋,每間房內都藏有一定的現金。這個地方所有的房屋都圍成一圈,這意味着第一個房屋和最後一個房屋是緊挨着的。同時,相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。
給定一個代表每個房屋存放金額的非負整數數組,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。
示例1
輸入:
[2,3,2]
輸出:
3
示例2
輸入:
[1,2,3,1]
輸出:
4
題解
這題和上一題唯一區別就是首尾只能選一個偷,那麼我們可以分爲兩種情況。
如果不偷第一個,那麼問題就變成了在後 個裏面偷取的最大價值。
如果不偷最後一個,那麼問題就變成了在前 個裏面偷取的最大價值。
而這兩個轉化後的問題就沒有首尾連接的約束了,可以直接採用上一題的解法求解,轉移方程還是:
最終取兩種情況的較大值就行了。
代碼
c++
class Solution {
public:
int rob1(vector<int>& nums, int l, int r) {
int prepre = 0, pre = 0, now = 0;
for (int i = l; i <= r; ++i) {
now = max(pre, prepre+nums[i]);
prepre = pre;
pre = now;
}
return now;
}
int rob(vector<int>& nums) {
int n = nums.size();
if (n == 1) return nums[0];
int a = rob1(nums, 0, n-2);
int b = rob1(nums, 1, n-1);
return max(a, b);
}
};
參考資料
[1]
LeetCode 213. 打家劫舍 II: https://leetcode-cn.com/problems/house-robber-ii/
[2]
【每日算法Day 104】偷電瓶的周某今天放出來了,還不趕緊做這道題防範一下!: https://godweiyang.com/2020/04/18/leetcode-198/