求子陣列的最大和

pengfoo發表於2012-09-25

/*題目:輸入一個整形陣列,陣列裡有正數也有負數,陣列中一個或連續的多個正數,求所有子陣列的和的最大值,要求時間複雜度為O(n)很容易理解,當我們加上一個正數時,和會增加;當我們加上一個負數時,和會減少。如果當前得到的和是個負數,那麼這個和在接下來的累加中應該拋棄並重新清零,不然的話這個負數將會減少接下來的和。基於這樣的思路,我們可以寫出如下程式碼。

程式碼不僅求出了最大和,而且記錄下了起始點和末尾的座標。

例如:1,-2,3,10,-4,7,2,-5最大子陣列和為18,起始點和末尾座標為2,6 */

 

#include<stdio.h>

int SumOfMax(int *array,int length, int* begin, int* end)//利用begin和end存放起始和最後的下標
{
	int i;
	//int maxSum=0x80000000;//
	int maxSum= -(1<<31);
	int currentSum=0;
	printf("%d",currentSum);
	if(array==NULL || length<=0)
		printf("Invaild parameters");

	
	for(i=0; i<length; i++)
	{
		if(currentSum<=0)
		{
			currentSum=array[i];
			*begin = i;
		}

		else
		{
			currentSum += array[i];
			*end = i-1;
		}

		if( currentSum > maxSum )
		{
			maxSum = currentSum;
			*end = i;
		}
	}
	return maxSum;

}
int main()
{
	int a[]={1,-2,3,10,-4,7,2,-5};
	int length=sizeof(a)/sizeof(int);
	int first,last;
	printf("%d\n",SumOfMax(a,length,&first,&last));
	printf("%d %d",first,last);
}


 

相關文章