最大子序列和问题O(N)

问题描述:

给定一整数序列A1, A2,... An (可能有负数),求A1~An的一个子序列Ai~Aj,使得Ai到Aj的和最大。

解决思想:

要想让时间复杂度为O(N),就只能用一个for(或while等的)循环。即遍历一遍数组。

1.我们可以从头遍历,把每一个元素相加,每加一次就与最大和进行比较,留下最大的;

2. 小于0的元素不可能成为最大子序列的第一或最后一个值(把它去掉的子序列和将更大);

3.当子序列和小于0的时候,代表这个序列不是我们想要的(空集子序列和为0,肯定比负数要大);

4.当子序列小于0时(最后一个元素让子序列为负,所以最后一个元素肯定是负数),让最后一个元素隔绝了前面的元素(前面的元素与最后一个元素相加不可能大于0),所以要从这个子序列的最后一个元素的下一个元素开始推进。

代码:

#include <iostream>
#include <vector>
using namespace std;
int maxsubsum(const vector<int>& a){//等同数组C中的传入首地址
        int maxsum=0;
        int thissum=0;
        for(int i=0;i<a.size();i++){//a.size为数组的元素个数
                thissum+=a[i];
                if(thissum>maxsum)
                        maxsum=thissum;
                if(thissum<0)
                        thissum=0;
        }
        return maxsum;
}

int main(){
        vector<int> a{-2,11,-4,13,-5,2,-5,-3,12,-9};
        cout<<maxsubsum(a)<<endl;
}

结果:


猜你喜欢

转载自blog.csdn.net/lingfeng2019/article/details/78672685