动态规划 \(O(n)\)
使用两个状态表示
f[i]
表示1~i家中必偷i家的偷窃最大金额
g[i]
表示1~i家中必不偷i家的偷窃最大金额
时间复杂度
\(O(n)\)
空间复杂度
\(O(2n)\)
Tip
以后能一眼看出来的复杂度我就不写了
class Solution {
public:
int rob(vector<int>& nums) {
int n = nums.size();
if (!n) return 0;
vector<int> f(n), g(n);
f[0] = nums[0];
for (int i = 1; i < n; i ++)
{
f[i] = g[i - 1] + nums[i];
g[i] = max(g[i - 1], f[i - 1]);
}
return max(f[n - 1], g[n - 1]);
}
};