ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Leetcode的中等算法题:198. 打家劫舍

2022-07-27 04:32:04  阅读:186  来源: 互联网

标签:198 nums int max 金额 抢到 打家劫舍 Leetcode dp


链接:https://leetcode.cn/problems/house-robber/

方法1

学会了动态规划思路后,我独立想出来的一个方法,缺点是代码不够优雅(dp和nums的序号有错位)。

我的代码

int max(int a,int b){
    return a>b?a:b;
}
int rob(int* nums, int numsSize){
    // dp预留出来2个位置.dp[i+2]表示num[]偷到第i个(下标计数)房屋时的最高金额
    int dp[103],res=nums[0];
    int j=2;//用j表示dp的下标
    dp[0] = dp[1] = 0;
    dp[j] = nums[0];
    for(int i=1;i<numsSize;i++){
        j = i+2;
        dp[j] = max(dp[j-3]+nums[i],dp[j-2]+nums[i]);
        res = max(dp[j],dp[j-1]);
    }
    return res;
}

提交结果

执行结果:
通过
显示详情
添加备注

执行用时:
0 ms
, 在所有 C 提交中击败了
100.00%
的用户
内存消耗:
5.7 MB
, 在所有 C 提交中击败了
63.14%
的用户
通过测试用例:
68 / 68

思路

状态数组dp[]存放抢了第i个(下标计)房屋抢劫时,所抢到的最大金额。注意,并不一定抢到前i个房屋时的最大金额,因为抢到第i-1时更大呢。

抢到第i个时,上一个抢的应该是第i-2或第i-3个房屋。因为不能连续,所以不能是i-1,但也不一定就是i-2,也可以是i-3啊。i-4就没必要了,如果算i-4就肯定少算了与之间隔的i-2。

代码的dp[]下标用j表示,并不与nums的i相同,采取了错位的方法。没那么优雅了。

方法2

也是动态规划的方法,与我独立想出来的不同点有二,一是在for循环中使用了临界判断,虽然加大了运算消耗,但是避免了dp[]与nums[]的错位;二是dp[]直接以结果为导向,dp[i]直接记录抢到前i个房屋时的最大金额。我一拍脑门,优化了一的缺点。可以看一看我和up主代码的不同点。
参考:https://www.bilibili.com/video/BV14b4y177DM?p=1&t=122.2

我优化后的代码

int max(int a,int b){
    return a>b?a:b;
}
int rob(int* nums, int numsSize){
    int dp[110];
    dp[0] = nums[0];
    if(numsSize>1){
        dp[1] = max(nums[0],nums[1]);
    }
    for(int i=2;i<numsSize;i++){
        dp[i] = max(dp[i-1],dp[i-2]+nums[i]);
    }
    return dp[numsSize-1];
}

提交结果

执行结果:
通过
显示详情
添加备注

执行用时:
0 ms
, 在所有 C 提交中击败了
100.00%
的用户
内存消耗:
5.6 MB
, 在所有 C 提交中击败了
84.31%
的用户
通过测试用例:
68 / 68

思路

初始状态:

dp[0] = nums[0];
dp[1] = max(nums[0],nums[1]);

状态方程:

dp[i] = max(dp[i-1],dp[i-2]+nums[i]);

抢到第i个时,看一看dp[i-1]与dp[i-2]+nums[i]谁大,dp[i-1]表示抢到第i-1个时最大金额,dp[i-2]表示抢到第i-2个时最大金额,nums[i]表示第i个房屋的金额。dp[i-2]+nums[i]表示抢第i个房屋时的金额,但不一定是最大金额,所以与dp[i-1]做比较。

标签:198,nums,int,max,金额,抢到,打家劫舍,Leetcode,dp
来源: https://www.cnblogs.com/tsuish/p/16523271.html

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

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

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

ICode9版权所有