【LeetCode刷题】-C++-简单-198-打家劫舍

该博客探讨了LeetCode中的第198题‘打家劫舍’,通过C++语言提供了解决方案。作者首先介绍了遍历并分别计算奇偶位置的解法,解释了为何需要考虑相邻房屋不能同时被盗以避免被捕。接着,作者尝试使用动态规划的方法,虽然对其理解不深,但通过学习和实践理解了动态规划的优势,即能更高效地找到最大盗窃金额。最后,对比了两种方法的时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Task:

在这里插入图片描述

思路:

【解法一:遍历,奇偶分别求和】

思路参考:
在这里插入图片描述
首先这个题目,要明白的就是,偷了一间房子,那么与之直接相连接的房子是不能再去偷了,不然就要被抓住完蛋了!
那么就要隔间偷,所以首先想到的就是分为奇偶数进行,但是这样有一个问题:
我们的目标是要偷到的金额最大,那么只偷奇数或者只偷偶数就不能保证是最大的:因为可能有一段是奇数家的钱多,有一段是偶数家的qia多,所以需要找准一个时机。当这一段的最优解没有另外一边好的时候,就把好的那边的复制过来!
代码:

class Solution {
public:
    int rob(vector<int>& nums) {
        if (nums.size() == 0 ) return NULL;
        int sumOdd = 0; // 奇数
        int sumEven = 0; // 偶数
        for (int i=0; i<nums.size(); i++){
            if( i % 2 == 0){
                sumEven += nums[i];
                sumEven = max (sumEven, sumOdd);
            }else{
                sumOdd += nums[i];
                sumOdd = max(sumOdd, sumEven);
            }
        }
        return  max(sumEven, sumOdd);     
    }
};

提交结果:
在这里插入图片描述
【解法二:动态规划】
动态规划的不太懂,我都不清楚什么是动态规划,今天大概看一下:
代码:

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


提交结果:
在这里插入图片描述
可以看出来,基于动态规划的方法,时间复杂度明显要好很多!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值