描述
你是一个经验丰富的小偷,准备偷沿湖的一排房间,每个房间都存有一定的现金,为了防止被发现,你不能偷相邻的两家,即,如果偷了第一家,就不能再偷第二家,如果偷了第二家,那么就不能偷第一家和第三家。沿湖的房间组成一个闭合的圆形,即第一个房间和最后一个房间视为相邻。
给定一个长度为n的整数数组nums,数组中的元素表示每个房间存有的现金数额,请你计算在不被发现的前提下最多的偷窃金额。
数据范围:数组长度满足
1
≤
n
≤
2
×
1
0
5
1 \le n \le 2\times10^5
1≤n≤2×105 ,数组中每个值满足1≤nums[i]≤5000
示例1
输入:[1,2,3,4]
返回值:6
说明:最优方案是偷第 2 4 个房间
示例2
输入:[1,3,6]
返回值:6
说明:由于 1 和 3 是相邻的,因此最优方案是偷第 3 个房间
代码
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型vector
* @return int整型
*/
int getRob(vector<int> &nums){
if(nums.size()==0)
return 0;
vector<int> dp(nums.size()+1,0);
for(int i=1;i<=nums.size();i++){
if(i==1)
dp[i]=nums[i-1];
else{
if(dp[i-1]>dp[i-2]+nums[i-1])
dp[i]=dp[i-1];
else
dp[i]=dp[i-2]+nums[i-1];
}
}
return dp[nums.size()];
}
int rob(vector<int>& nums) {
// write code here
vector<int> nums1,nums2;
nums1.assign(nums.begin()+1,nums.end());
nums2.assign(nums.begin(),nums.end()-1);
int rob1=getRob(nums1);
int rob2=getRob(nums2);
return max(rob1,rob2);
}
};