问题:一数组的两个子数组的和最大,要求O(n)

 

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<time.h>
 4 /*
 5   一数组的两个子数组的和最大,要求O(n) 
 6 */ 
 7 int main()
 8 {
 9  int Max = 0, MMax = 0;  //Max 记录每次的最大值, MMax记录两个数组和的最大值 
10  int a[10], b[10];  //a[] 为原数组    b[]用来记录从右向左遍历时到当前位置的最大和 
11  int sum = 0, i;   
12  
13  
14  srand((unsigned)time(NULL));
15  
16  printf("数组元素为:  ");
17  for(i = 0; i < 10; ++i)
18  {
19   a[i] = rand()%10 - 5;
20   printf("%d   ", a[i]);
21   
22  }
23  
24  for(i = 9; i > 0; --i)   //从右向左遍历时,记录最大值 
25  {
26   sum += a[i];
27   if(sum < 0)
28   {
29    sum = 0;
30   }
31   else
32   {
33    if(sum > Max)
34    {
35     Max = sum;
36    }
37   }
38   b[i] = Max;
39  }
40  
41  sum = 0; Max = 0;
42  
43  for(i = 0; i < 9; ++i)  //从左向右遍历时,此时的最大与后面的最大值相加 
44  {
45   sum += a[i];
46   if(sum < 0)
47   {
48    sum = 0;
49   }
50   else
51   {
52    
53    if(MMax < (sum + b[i+1]))
54    MMax = sum + b[i+1]; 
55   }
56  }
57  
58  printf("\n");
59  printf("MMax = %d\n", MMax);
60  return 0;
61 }