题解 | #打家劫舍(二)#

打家劫舍(二)

https://www.nowcoder.com/practice/a5c127769dd74a63ada7bff37d9c5815

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)

分情况讨论

全部评论

相关推荐

07-16 17:55
门头沟学院 Java
点赞 评论 收藏
分享
06-25 16:25
梧州学院 Java
愿汐_:项目介绍那么长,然而你做了啥就一句话?
点赞 评论 收藏
分享
头顶尖尖的程序员:我是26届的不太懂,25届不应该是找的正式工作吗?为什么还在找实习?大四还实习的话是为了能转正的的岗位吗
点赞 评论 收藏
分享
昨天 18:37
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务