美文网首页
Leetcode DP2 最大子序列和

Leetcode DP2 最大子序列和

作者: golfgang | 来源:发表于2018-09-03 23:54 被阅读0次

题目

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

示例:

输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

问题分解

  1. subproblem: 第i个数加上前面第j个数到第i-1个数的和小于第i个数本身,则不连续,从i开始计算。

  2. guess: 只需要知道加或者不加,加就连续,不加就重新开始,判断条件为:第i-1位置上的最大连续子数组和S_{i-1}加上第i个数会不会变大。所以
    if nums[i]+S_{i-1}<nums[i] : S_{i}= S_{i-1}+nums[i]
    else : S_{i} = nums[i]

  3. related:建立一个dp表,记录S_{i}就ok了

  4. bottom up

  5. solve the original problem

代码实现

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

相关文章

网友评论

      本文标题:Leetcode DP2 最大子序列和

      本文链接:https://www.haomeiwen.com/subject/xydwwftx.html