213. 打家劫舍 II

Problem: 213. 打家劫舍 II

思路

连成了一个环,说明可以有两种情况。

第一个:从第0间开始偷,最后一间不偷。

第二个:从第一间开始偷,最后一间偷。

我们按照198. 打家劫舍的思路,分别对两种情况,做一次动态规划,最后再比较大小就好了。

复杂度

时间复杂度:

添加时间复杂度, 示例: $O(n)$

空间复杂度:

添加空间复杂度, 示例: $O(n)$

Code

[]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
public:
int robRange(vector<int>& nums,int start,int end) {
//从start偷盗至end
if (end == start) return nums[start];
vector<int> dp(nums.size());
dp[start] = nums[start];
dp[start + 1] = max(nums[start], nums[start + 1]);
//遍历房子
for (int i = start + 2; i <= end; i++) {
//偷本间(没偷上一间) 不偷本间(偷了上一间)
dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);
}
return dp[end];
}
int rob(vector<int>& nums) {
if (nums.size() == 0) return 0;
if (nums.size() == 1) return nums[0];
//从第0间开始偷 最后一间不偷
//从第一间开始偷 最后一间偷
return max(robRange(nums,0, nums.size()-2), robRange(nums,1,nums.size()-1));
}
};