求数组的子数组之和的最大值
动态规划思想:时间复杂度为O(N),空间复杂度为O(N)和O(1)的两种解法
int MaxSum(int *A, int n)
{
int *All = new int[n];//All[i]表示从i开始的,最大子数组之和,可能包含A[i]
int *start = new int[n];//start[i]表示以i开头的最大子数组之和,包含i
start[n - 1] = A[n - 1];
All[n - 1] = A[n - 1];
//All[i]=max(A[i],A[i]+start[i+1],All[i+1])
//start[i]=max(A[i],A[i]+start[i+1]
for (int i = n - 2;i >= 0;i--)
{
start[i] = max(A[i], A[i] + start[i + 1]);
All[i] = max(max(A[i], A[i] + start[i + 1]), All[i + 1]);
}
return All[0];
}
int MaxSum1(int *A, int n)
{
int start = A[n - 1];
int All = A[n - 1];
//All[i]=max(A[i],A[i]+start[i+1],All[i+1])
//start[i]=max(A[i],A[i]+start[i+1]
for (int i = n - 2;i >= 0;i--)
{
All = max(max(A[i], A[i] + start), All);
start = max(A[i], A[i] + start);
}
return All;
}
时间复杂度为O(N*log2(N))的和O(N^2)的解法
int MaxSum1(int *A,int n)
{
int sum = INT_MIN;
for (int i = 0; i < n; i++)
{
int temsum = 0;
for (int j = i; j < n; j++)
{
temsum = temsum + A[j];
if (temsum > sum)
sum = temsum;
}
}
return sum;
}
int MaxSum11(int *A, int begin, int end)
{
if (begin == end)
return A[begin];
int mid = (begin + end) / 2;
int leftsum = 0, maxleftsum = INT_MIN;
int rightsum = 0, maxrightsum = INT_MIN;