leetcode 198. 打家劫舍

本文探讨了House Robber问题的解决思路,从最初的递归方法出发,虽然能解决问题但存在超时风险。随后转向动态规划策略,有效避免了重复计算,显著提升了效率。文中详细对比了两种方法,并提供了C++实现代码,展示了动态规划如何从前向后计算最大收益。

一开始肯定是想用递归做:56 / 69 个通过测试用例

超时不可避免。

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

改动态规划?重复利用:(爬楼梯升级版)

 注意:递归和动态规划区别:递归从后往前。动态规划从前往后:!!!!

执行用时 : 4 ms, 在House Robber的C++提交中击败了97.83% 的用户

内存消耗 : 8.7 MB, 在House Robber的C++提交中击败了72.94% 的用户

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值