问题:一数组的两个子数组的和最大,要求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(" "); 59 printf("MMax = %d ", MMax); 60 return 0; 61 }