213. 打家劫舍 ll

题目链接:

状态划分:考虑是否偷 \(\rm nums[0]\)

  • 若偷 \(\rm nums[0]\),则 \(\rm nums[1]\)\(\rm nums[n-1]\) 不能偷,问题变为从 \(\rm nums[2]\)\(\rm nums[n-2]\) 的非环形版本,可直接调用 198 题的代码

  • 若不偷 \(\rm nums[0]\),问题变为从 \(\rm nums[1]\)\(\rm nums[n-1]\) 的非环形版本,同样调用198 题的代码解决

注:这种截出一段的非环形版本,用空间优化后的代码版本更为简洁。

class Solution {
public:
    int rob1(vector<int> &nums, int start, int end) {//[start,end)左闭右开
        int f0 = 0, f1 = 0;//f0表示上上次的结果, f1表示上次的结果
        for (int i = start; i < end; i++) {
            int new_f = max(f1, f0 + nums[i]);
            f0 = f1;
            f1 = new_f;
        }
        return f1;//f1是最后一次算出来的new_f
    }
    int rob(vector<int>& nums) {
        int n = nums.size();
        return max(nums[0] + rob1(nums, 2, n - 1), rob1(nums, 1, n));
    }
};
posted @ 2024-04-16 09:54  胖柚の工作室  阅读(17)  评论(0)    收藏  举报