今天有事,下面的代码是我在公交车上用手机写的,格式可能有些不对,在看完《算法导论》上的divide-and-conquer后,我隐隐记得《编程之美》中好像有,我刚刚查了下书,果真,这个算法被称为“联机算法”,不过书中没用给出对应子数组的下标。
思想是:
1.从数组的第一个元素依次往后加,如果遇到和为负的就将其丢掉,从第一个非负数开始,因为有负数一定会减小其后面的和。
2. 在其和都大于0的情况下,不停的更新其值。
具体可以参考《编程之美》。
/*******************************************************************************
* @version $v1.0$
* @date $6.10.2012$
* @author $Alfred$
* @brief find the max subarray with O(N)
*******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#define NUM 10
int main(void)
{
int a[NUM] = { -2,4,-8,-23,37,23,1,-2,-10,54};
int begin, end, maxValue;
int maxSubarray (int *a, int num, int *left, int * right);
maxValue = maxSubarray ( a, NUM, &begin, &end);
printf("%d,%d,%d", begin, end, maxValue);
return 0;
}
int maxSubarray (int *a, int num, int *left, int * right)
{
int sum = 0;
int maxValue = - 1000;
int i;
*left = 0; //if the first number is positive
for ( i = 0; i < num; i++)
{
sum = sum + a[i];
if (sum < 0)
{
sum = 0;
*left = i + 1; //update the value of the *left when the former sum is negative
}
else
{
if (sum > maxValue )
{
maxValue = sum;
*right = i; //record the value of *right
}
}
}
return maxValue;
}