leetcode_198解题思路

该题属于常规的递归和动态规划(DP)思想,直接上答案:

#include<iostream>
#include<vector>
#include <algorithm>
using namespace std;

//方法一:递归法,出现LTE错误
class Solution {
public:
    int rob(vector<int>& nums) {
        if (!nums.size())
            return 0;
        int max = 0, index = 0, sum = 0, flag = 0;
        recursion(nums, index, sum, max, flag);
        return max;
    }
    void recursion(vector<int>& nums, int index, int sum, int& max, int flag) {
        if (index == nums.size())
        {
            if (sum > max)
                max = sum;
            return;
        }
        if (flag == 0)
        {
            //取当前数
            recursion(nums, index + 1, sum + nums[index], max, 1);
            //或者不取当前数
            recursion(nums, index + 1, sum, max, 0);
        }
        else
            //无法取当前数
            recursion(nums, index + 1, sum, max, 0);
    }
};

//方法二:DP法
class Solution {
public:
    int rob(vector<int>& nums) {
        if (!nums.size())
            return 0;
        if (nums.size() == 1)
            return nums[0];
        if (nums.size() == 2)
            return max(nums[0], nums[1]);
        vector<int> sumMax(nums.size());
        sumMax[0] = nums[0];
        sumMax[1] = max(nums[0], nums[1]);
        for (int i = 2; i < nums.size(); ++i)
        {
            sumMax[i] = max((sumMax[i - 2] + nums[i]), sumMax[i - 1]);
        }
        return sumMax.back();
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值