【LeetCode】No.53 最大子序和(动态规划)

 

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

这是一个最大连续子数组和的问题。有同学会问,这是怎么看出来的,因为在数组中求两点的差,而两点之差可以转换成求和问题。也许你还是一脸懵,这怎么想的到。如果你学过高等数学,对牛顿莱布尼茨公式有印象的话:

只不过,在我这里,F() 函数不是连续的,而是离散化的,aa 和 bb 表示数组的下标。但是这不影响我们得出正确的结论。

总结下:区间和可以转换成求差的问题,求差问题,也可以转换成区间和的问题。

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        if(prices.empty())
            return 0;
        vector<int> profit(prices.size());
        int maxvalue = 0;
        profit[0]=0;
        for(int i=1;i<prices.size();i++){
            profit[i]=prices[i]-prices[i-1];
            profit[i]=max(profit[i-1]+profit[i],profit[i]);
            maxvalue = maxvalue>profit[i]?maxvalue:profit[i];
        }
        return maxvalue;
    }
};

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值