求一组数组中和最大的连续子序列
以下展示四种方法,时间复杂度依次递减。
func1 O(N^3)
func2 O(N^2)
func3 O(NlogN)
func4 O(N)
// ConsoleApplication1.cpp: 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
int func1(int* arr, int n) {
int i = 0, max = 0;
for (i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
int sum = 0;
for (int k = i; k <= j; k++) {
sum += arr[k];
}
if (sum >= max)
max = sum;
}
}
return max;
}
int func2(int* arr, int n) {
int i = 0, max = 0;
for (i = 0; i < n; i++) {
int sum = 0;
for (int j = i; j < n; j++) {
sum += arr[j];
if (sum >= max)
max = sum;
}
}
return max;
}
int func3(int* arr, int left, int right) {
int sumLeft, sumRight;
int sumMidLeft, sumMidRight;
int maxMidLeft, maxMidRight;
int center;
if (left == right) {
if (arr[left] > 0)
return arr[left];
else
return 0;
}
center = (left + right) / 2;
sumLeft = func3(arr, left, center);
sumRight = func3(arr, center + 1, right);
sumMidLeft = 0; maxMidLeft = 0;
for (int i = center; i >= left; i--) {
sumMidLeft += arr[i];
if (sumMidLeft >= maxMidLeft)
maxMidLeft = sumMidLeft;
}
sumMidRight = 0; maxMidRight = 0;
for (int i = center + 1; i <= right; i++) {
sumMidRight += arr[i];
if (sumMidRight >= maxMidRight)
maxMidRight = sumMidRight;
}
int temp = sumLeft >= sumRight ? sumLeft : sumRight;
return temp >= (maxMidLeft + maxMidRight) ? temp : maxMidLeft + maxMidRight;
}
int func4(int* arr, int n) {
int i = 0, max = 0, sum = 0;
for (i = 0; i < n; i++) {
sum += arr[i];
if (sum >= max)
max = sum;
else if(sum < 0)
sum = 0;
}
return max;
}
int arr[8] = {5, 6, 7, -9, 8, -2, -10, 12};
int main()
{
int ret = 0;
ret = func1(arr, 8);
printf("func1 = %d\n", ret);
printf("func2 = %d\n", func2(arr, 8));
printf("func3 = %d\n", func3(arr, 0, 8 - 1));
printf("func4 = %d\n", func4(arr, 8));
system("pause");
return 0;
}