题意:House Robber 的衍生题,将直线改成环。
思路:遍历两次,一次包含头,一次不包含头。包含头的需要记录是否最终结果包含头。
class Solution {
public:
int rob(vector<int>& nums) {
if(nums.size() == 0) return 0;
if(nums.size() == 1) return nums[0];
vector<bool> incf(nums.size(), 0);
vector<int> robs = nums;
vector<int> robf = nums;
if(nums[0] < nums[1]) incf[1] = true;
else robf[1] = robf[0];
for(int i = 3; i < robs.size(); ++ i) {
robs[i] = max(robs[i] + robs[i - 2], robs[i - 1]);
}
for(int i = 2; i < robf.size(); ++ i) {
if(robf[i] + robf[i - 2] > robf[i - 1]) {
robf[i] += robf[i - 2];
incf[i] = incf[i - 2];
}
else{
robf[i] = robf[i - 1];
incf[i] = incf[i - 1];
}
}
int re = 0;
if(incf[nums.size() - 1]) {
for(int i = 0; i < robf.size(); ++ i)
re = max(re, robf[i]);
return re;
}
else {
return max(robf[nums.size() - 2], robs[nums.size() - 1]);
}
}
};更好的思路是,遍历两次,一次包含头,不包含尾,一次不包含头,包含尾。直接比较结果。

解决环形房屋抢劫问题,通过两种遍历策略实现最优解。一种遍历方式包含头节点而不含尾节点,另一种则相反。最终比较两种策略的结果来找到最大收益。
484

被折叠的 条评论
为什么被折叠?



