题目:
其实这题很容易能想到使用动态规划做(刚开始我还想了滑动窗口来着)。因为对于任何一间房子,都只有偷和不偷两种情况,偷的话则只能从dp【i-2】+nums【i】得来,否则,只能从dp【i-1】得来。
动态转移方程:dp【i】 = max(dp【i-2】+nums【i】+dp【i-1】)
然后,这题首尾是相连的。我觉得思考角度可以和题解有一些差别。题解是选择偷A或者偷B,代表这两个里面必须偷一个。我觉得不如这么思考,偷第一家或者不偷第一家。
偷第一家的话,整体范围就会-1,不偷第一家的话,起始点+1,整体范围不变。可以得到和题解一样的效果。
题解把动态规划的函数抽象出来了,这样确实更简洁一点。
C++代码:
class Solution {
public:
int robRange(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;
}
int rob(vector<int>& nums) {
int length = nums.size();
if (length == 1) {
return nums[0];
} else if (length == 2) {
return max(nums[0], nums[1]);
}
return max(robRange(nums, 0, length - 2), robRange(nums, 1, length - 1));
}
};