求子数组最大和

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 /*求子数组最大和,时间复杂度o(n),数组有正、负整数*/
 4 /*分析,要求时间复杂度o(n),则只能读一次数组,顺序求解
 5  *由于有正数,全部排除负和。
 6  *可使用动态机分析。max(x[i])分两种状况,max(x[i-1])<=0和max(x[i-1])>0
 7  */
 8 #define len(x) (sizeof(x)/sizeof(x[0]))
 9 int bigsum_subarray(int *x, int len)
10 {
11     if(x == NULL || len <= 0)
12         return -1;
13 
14     int i, total = 0, tmp = 0;
15 
16     for(i = 0; i < len; i++){
17         if(tmp <= 0)
18             tmp = x[i];
19         else
20             tmp += x[i];
21         if(tmp > total)
22             total = tmp;
23     }
24     return total;
25 }
26 int main(void)
27 {
28     int total, x[] = {1, -2, 3, -10, -4, 7, 15, -5};
29 
30     total = bigsum_subarray(x, len(x));
31 
32     printf("%d\n", total);
33     return 0;
34 }
相关文章
相关标签/搜索