动态规划:
因为题目说到住户首尾相连,需要考虑的问题是,当偷了第一家,就不能偷最后一家,
因此得出两个偷窃范围 0 到 (n - 2),1 到 (n - 1),得出这两个范围的最大值,
然后再比较最大值即为偷窃最高金额
考虑特殊情况,当只有一家时直接返回
当有两家或三家时,获取最大值
超过三家则有如下状态转移方程:
class Solution {
public:
int rob(vector<int>& nums) {
int len = nums.size();
if (1 == len) {
return nums[0];
}
if (2 == len) {
return max(nums[0], nums[1]);
}
if (3 == len) {
return max(max(nums[0], nums[1]), nums[2]);
}
return max(robber(nums, 0, len - 2), robber(nums, 1, len - 1));
}
int robber(vector<int>& nums, int start, int end)
{
int first = nums[start], second = max(nums[start], nums[start + 1]);
for (int i = start + 2; i <= end; ++i) {
int temp = second;
second = max(first + nums[i], second);
first = temp;
}
return second;
}
};