问题描述:
给定一整数序列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; }