// 问题一: 连续子序列和问题
// 解法一: 暴力求解
// 时间组复杂度 O(n^3)
int maxSubSequenceSum1(int* source, int n) {
if(source == NULL || n <= 0) {
return 0;
}
int maxSum = 0;
for (int i = 0; i < n; ++i) {
for (int j = i; j < n; ++j) {
int localmax = 0;
for (int k = i; k <= j; ++k) {
localmax += source[k];
}
if(localmax > maxSum) {
maxSum = localmax;
}
}
}
return maxSum;
}
// 解法二: 优化暴力解法
// 时间复杂度 O(n^2)
int maxSubSequenceSum2(int* source, int n) {
if(source == NULL && n <=0) {
return 0;
}
int maxSum = 0;
for (int i = 0; i < n; ++i) {
int localsum = 0;
for (int j = 0; j < n; ++j) {
localsum += source[j];
if(localsum > maxSum) {
maxSum = localsum;
}
}
}
return maxSum;
}
// 解法三: 归并
// 时间复杂度 O(nlogn)
int maxCrossSum(int* source, int low, int high) {
int mid = low + (high - low) / 2;
int leftstart= mid, rightend = mid + 1;
int leftsum = 0, rightsum = 0;
int leftlocalsum = 0, rightlocalsum = 0;
for (int i = mid; i >= low ; --i) {
leftlocalsum += source[i];
if(leftlocalsum > leftsum) {
leftsum = leftlocalsum;
leftstart = i;
}
}
for (int j = mid + 1; j <= high; ++j) {
rightlocalsum += source[j];
if(rightlocalsum > rightsum) {
rightsum = rightlocalsum;
rightend = j;
}
}
return leftsum + rightsum;
};
int maxAllTheArray(int* source, int low, int high) {
if(source == NULL || low > high) {
return 0;
}
if(low == high) {
return source[low];
}
if(low < high) {
int mid = low + (high - low) / 2;
int left = maxAllTheArray(source,low ,mid);
int right = maxAllTheArray(source,mid +1,high);
int cross = maxCrossSum(source,low,high);
return max(left,max(right,cross));
}
}
int maxSubSequenceSum3(int* source, int n) {
return maxAllTheArray(source,0,n-1);
}
// 解法四: 一次遍历
// 时间复杂度 O(n)
int maxSubSequenceSum4(int* source, int n) {
if(source == NULL || n <=0) {
return 0;
}
int g_sum = 0, l_sum = 0;
for (int i = 0; i < n; ++i) {
l_sum += source[i];
if(l_sum > g_sum) {
g_sum = l_sum;
}
if(l_sum < 0) {
l_sum = 0;
}
}
return g_sum;
}
最大连续子序列最大和的四种解法
最新推荐文章于 2024-06-09 14:21:24 发布