下面来介绍一道LeetCode上的题:
Find the contiguous subarray within an array (containing at least one number) which has the largest sum.
For example, given the array [-2,1,-3,4,-1,2,1,-5,4],
the contiguous subarray [4,-1,2,1] has the largest sum = 6.
算法一:暴力枚举法,算法复杂度为O(N三次方)
int maxsequence1(int A[], int N)
{
int ThisSum , MaxSum=0;
int i, j, k;
for (i = 0; i <= N; i++) {
for (j = i; j <= N; j++) {
ThisSum = 0;
for (k = i; k <= j; k++)
ThisSum += A[k];
if (ThisSum > MaxSum)
MaxSum = ThisSum;
}
}
return MaxSum;
}
算法二:算法一的改进,减少一个for循环,复杂度为O(N平方)
int maxsequence2(int A[], int N)
{
int ThisSum, MaxSum = 0;
int i, j;
for (i = 0; i <= N; i++) {
ThisSum = 0;
for (j = i; j <= N; j++) {
ThisSum += A[j];
if (ThisSum > MaxSum)
MaxSum = ThisSum;
}
}
return MaxSum;
}
算法三:分而治之。算法复杂度为O(NlogN)
int Max(int A, int B, int C)
{
/return A > B ? A > C ? A :C: B > C ? B : C;/
if (A > B) {
if (A > C)
return A;
else
return C;
}
else if (B > C)
return B;
else return C;
}
int DivideAndConquer(int List[], int left, int right) {
int MaxLeftSum, MaxRightSum;
int MaxLeftBoardSum, MaxRightBoardSum;
int LeftBoardSum, RightBoardSum;
int center,i;
/递归终止条件/
if (left == right) {
if (List[left] > 0)
return List[left];
else
return 0;
}
center = (right + left) / 2;
MaxLeftSum = DivideAndConquer(List, left, center);
MaxRightSum= DivideAndConquer(List, center+1, right);
MaxLeftBoardSum = 0; LeftBoardSum = 0;
for (i = center;i >= left; i--)
LeftBoardSum += List[i];
if (LeftBoardSum > MaxLeftBoardSum)
MaxLeftBoardSum = LeftBoardSum;
MaxRightBoardSum = 0; RightBoardSum = 0;
for (i = center + 1; i <= right; i++)
RightBoardSum += List[i];
if (RightBoardSum > MaxRightBoardSum)
MaxRightBoardSum = RightBoardSum;
return Max(MaxLeftSum, MaxRightSum, MaxRightBoardSum + MaxLeftBoardSum);
}
int maxsequence3(int A[], int N)
{
return DivideAndConquer(A, 0, N-1);
}
算法四:在线处理算法,代码最简单,且复杂度最低,为O(N)
int maxsequence4(int A[], int N)
{
int ThisSum,MaxSum ;
int i;
ThisSum = MaxSum = 0;
for (i = 0; i <= N; i++) {
ThisSum += A[i];
if (ThisSum > MaxSum)
MaxSum = ThisSum;
else if (ThisSum < 0)
ThisSum = 0;
}
return MaxSum;
}
主程序如下