给一个数组,元素都是整数(有正数也有负数),寻找连续的元素相加之和为最大的序列(搜狐畅游2012.10.21机试题)
给一个数组,元素都是整数(有正数也有负数),寻找连续的元素相加之和为最大的子序列
例如a={1,-2,3,5,-4,6};最大和子序列是3,5,-4,6 要求算法复杂度为O(n)。(子序列为任意几个连续的元素)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 using namespace std; 3 int iL,iR;//iL是记录从左边扫描,当遇到sumL<0时继续扫描的第一个正数的下标,iR同理 4 int find(int array[] , int n) 5 { 6 int i , max , sum; 7 sum = max = array[0]; 8 iR=0; 9 for(i = 1 ; i < n ; ++i) 10 { 11 if(sum < 0) 12 sum = array[i]; 13 else 14 sum += array[i]; 15 if(sum > max) 16 { 17 max = sum; 18 iR=i; 19 } 20 21 } 22 if(max < 0) 23 { 24 max = 0;iL=iR=-1; 25 } 26 i=iR; 27 sum=max; 28 while(sum!=0) 29 { 30 sum-=array[i--]; 31 } 32 iL=++i; 33 34 return max; 35 } 36 int main() 37 { 38 int aaa[]={3,90,-25,-9,20,-7,-4,6,-2,3,10,1,-2}; 39 int len=sizeof(aaa)/sizeof(aaa[0]); 40 cout<<find(aaa,len)<<endl; 41 42 int i=0; 43 while(i<len) 44 cout<<aaa[i++]<<" "; 45 cout<<endl; 46 i=iL; 47 while(i<=iR) 48 cout<<aaa[i++]<<" "; 49 cout<<endl; 50 }