max subarray with O(N)

今天有事,下面的代码是我在公交车上用手机写的,格式可能有些不对,在看完《算法导论》上的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;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值