题目:输入一个整数数组,数组里有正数也有负数,数组中的一个或连续的多个整数组成一个子数组,求所有子数组的和的最大值,要求时间复杂度为O(n).
例如:输入数组为{1,-2,3,10,-4,7,2,-5},最大的子数组为{3,10,-4,7,2},因此输出为该子数组的和18.
思路:由于时间复杂度为O(n),所以只能一次一次遍历。用一个变量sum来从头遍历,将走过的数都加起来,加一次,就和变量max作比较,大的值存到max中。当sum变成负数的时候,将sum清0。因为找的是最大值,负数会拖累后面的最大值。让sum从下一个数继续遍历相加,再和max比较取最大值,这样遍历一遍后,max中存储的值即为所求。
#include<stdio.h>
#define MAX(a,b) a>b?a:b
int main()
{
int a[9]={1,-2,3,10,-4,7,2,-5,10};
int max = a[0];
int sum = a[0];
int* pa = a ;
int i = 0 ;
do{
if(sum<0)
sum = 0;
sum += *(++pa);
max = MAX(max,sum);
i++;
}while(i<9);
printf("max=%d\n",max);
return 0;
}