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

打家劫舍(一)

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

方法:动态规划

创建一个大小为nums.size() + 1的数组dp,dp[i]表示以nums[i - 1]结尾的数组的最大金额,对于dp[i]有两种情况,可以选择偷或者不偷:

选择偷:dp[i] = dp[i - 2] + nums[i - 1];

选择不偷:dp[i] = dp[i - 1]。选取两个中的最大值即为当前的最大金额。

dp的最后一个元素即为最后的输出

时间复杂度:o(n)

空间复杂度:o(n)

class Solution {
public:
    int rob(vector<int>& nums) {
        vector<int> dp(nums.size() + 1, 0);
        dp[1] = nums[0];

        for (int i = 2; i <= nums.size(); i++) {
            dp[i] = max(dp[i - 1], dp[i - 2] + nums[i - 1]);
        }
        return dp[nums.size()];
    }
};

刷题题解(c++) 文章被收录于专栏

算法题题解(c++)

全部评论

相关推荐

kl_我是东山啊:《相关公司:阿里巴巴》
投递阿里巴巴等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务