ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

leetcode198. House Robber

2021-10-10 15:31:46  阅读:220  来源: 互联网

标签:dp1 nums int House leetcode198 房子 Robber ans dp


题目:题目链接

思路:看他的related topics。然后动态规划做。
这一看就是一维的,为什么因为二维的我不会,你也就看不到这篇题解了。嘿嘿
咱们令dp[i]表示前i个房子能偷的最大值。那么此时有两种情况:要么选第i个房子,那i-1就不能选,只能加上dp[i-2]。要么不选第i个房子,那么就可以是dp[i-1]。因为数组都大于0,所以肯定不存在选择dp[i-3]的情况,然后跳过第i-1个房子的情况。所以就是这两种情况,取最大值就可以了。
可以得到状态转移方程:
d p [ i ] = m a x ( d p [ i − 2 ] + n u m s [ i ] + d p [ i − 1 ] ) dp[i] = max(dp[i-2]+nums[i] + dp[i-1]) dp[i]=max(dp[i−2]+nums[i]+dp[i−1])
边界情况: d p [ 0 ] = 0 dp[0]=0 dp[0]=0 , d p [ 1 ] = n u m s [ 0 ] dp[1]=nums[0] dp[1]=nums[0]
注意dp[i]是指第i个房子,从1开始的。(日常计数法)
而nums[i]是从0开始的(计算机计数法)

所以dp[i]对应的实际是前nums[i-1]个房子所拥有的最大值。
上代码:

class Solution {
public:
    int rob(vector<int>& nums) {
        int* dp = new int[nums.size()+5];
        dp[0] = 0;
        dp[1] = nums[0];
        for(int i = 2;i<=nums.size();++i)
            dp[i] = max(dp[i-2]+nums[i-1],dp[i-1]);
        return dp[nums.size()];
    }
};

空间复杂度是O(n),那咱们再和斐波那契数列数列一样优化一下:

class Solution {
public:
    int rob(vector<int>& nums) {
        int dp0 = 0;
        int dp1 = nums[0];
        int ans = dp1;
        for(int i = 2;i<=nums.size();++i){
            ans = max(dp0+nums[i-1],dp1);
            dp0 = dp1;
            dp1 = ans;
        }
        return ans;
    }
};

这样时间复杂度是O(n),空间就是O(1)了。完美。

加油加油!!!

标签:dp1,nums,int,House,leetcode198,房子,Robber,ans,dp
来源: https://blog.csdn.net/weixin_43216252/article/details/120686813

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有