1. 程式人生 > >求陣列中和最大的子陣列並輸出子陣列序列

求陣列中和最大的子陣列並輸出子陣列序列

輸入一個整形陣列,數組裡有正數也有負數。陣列中連續的一個或多個整陣列成一個子陣列,每個子陣列都有一個和。輸出和最大的子陣列。要求時間複雜度為O(n)。

例如輸入的陣列為A={0,-6,3,5,-1,2},和最大的子陣列為{3,5,-1,2},因此輸出為該子陣列的和9。

將陣列分為三個部分:i之前,i,i之後;

i之後是待確定的子陣列;

i之前是已經確定的子陣列;

i是待加入的元素;

nStart表示包含A[i]的和最大的子陣列;

nAll表示不包含A[i]的和最大的子陣列;

如果nStart<0,拋棄前面的子陣列(該子陣列不是和最大的子陣列),從i+1的位置開始尋找子陣列;

如果nStart > nAll ,A[i]加入子陣列;

int MaxSum(int *A, int n)
{
	assert(A && n > 0);
	int nStart = A[0];   
	int nAll = A[0];
	int begin = 0;
	int end = 0;
	for (int i = 0; i <= n - 1; i++)
	{
		/*
		0,-6 拋棄,重新尋找
		3,5,-1,2
		*/
		if (nStart < 0)
		{
			begin = i;
			nStart = 0;
		}
		nStart += A[i];
		if (nStart > nAll)
		{
			end = i;
			nAll = nStart;
		}
	}
	if (nAll >= 0)
	{
		for (int i = begin; i <= end; i++)
		{
			cout << A[i] << " ";
		}
		cout << endl;
		return nAll;
	}
	else
	{
		cout << nAll << endl;
		return nAll;
	}
	
}

void Test()
{
	int a[] = { 0, -6, 3, 5, -1, 2 };
	//int a[] = { -5, -1, -3, -5, -1, -2 };
	cout << MaxSum(a, sizeof(a) / sizeof(a[0])) << endl;
}