给一个数组,元素都是整数(有正数也有负数),寻找连续的元素相加之和为最大的序列(搜狐畅游2012.10.21机试题)

给一个数组,元素都是整数(有正数也有负数),寻找连续的元素相加之和为最大的子序列
例如a={1,-2,3,5,-4,6};最大和子序列是3,5,-4,6 要求算法复杂度为O(n)。(子序列为任意几个连续的元素)

 

View Code
 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 }
posted @ 2012-10-28 10:57  qinpan  阅读(430)  评论(0编辑  收藏  举报