class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型
     */
    int rob(vector<int>& nums) {
        // write code here

        int n = nums.size();

        if(n==1)
            return nums[0];
        else if(n==2)
            return max(nums[0], nums[1]);

        // 按照是否选择nums[n-1] 分为两种情况  最后计算两类情况的最大值
        int ans1, ans2;
        // 选择 nums[n-1] 0 和 n-2 都一定不能选
        int a1 = 0, b1 = nums[1];
        // 否则 初始值正常  两套初始值
        int a2 = nums[0], b2 = max(nums[0], nums[1]);

        for(int i=2; i<n; ++i)
        {
            if(i==n-1) // 只有在最后一刻 才特殊处理
            {
                ans1 = nums[i] + a1;
                ans2 = b2;
            }
            else // 中间的转移公式仍是完整的 和之前一样
            {
                ans1 = max(nums[i] + a1, b1);
                ans2 = max(nums[i] + a2, b2);
            }

            // 更新

            a1 = b1;
            b1 = ans1;

            a2 = b2;
            b2 = ans2;
        }

        return max(ans1, ans2);

    }
};

还是自己的做法 O(n) O(1)

分情况讨论