数据结构之最大子串问题
给定整数串,A_1,A_2,....A_n,求最大子串的问题,
下面给出三种方法:
#include <iostream>
#include <string>
#include "vector1.h"
#include "tree.h"
using namespace std;
int maxSubSequence(int *numArr, int len); //方法1
int maxSubsequence2(int *numArr,int left,int right);//方法2
int maxSubSequence3(int *numArr, int len);//方法3
int max3(int,int,int);
void main()
{
int testArr[] = {1,2,3,-4,5,6,1,2,9,10,-12,13,-15,5,2,3,4,5,1,6,-4}; //测试数据
int length = sizeof(testArr)/sizeof(int);
int maxResult = 0;
maxResult = maxSubSequence(testArr, length);
cout << "the max subsequence is " << maxResult << endl;
maxResult = maxSubsequence2(testArr, 0,length-1);
cout << "the max subsequence2 is " << maxResult << endl;
maxResult = maxSubSequence3(testArr,length);
cout << "the max subsequence3 is " << maxResult << endl;
}
int maxSubSequence3(int *numArr, int len) //速度最快,追求的是空间少,速度快 `O(N)`
{
int sum=0, max = 0;
for (int i = 0; i < len; i++)
{
sum += *(numArr + i);
if (sum > max)
max = sum;
if (sum < 0)
sum = 0;
}
return max;
}
int maxSubsequence2(int *numArr, int left, int right) //算法复杂度`O(N log(N))`
{
int maxLeft, maxRight;
int leftMax = 0, leftSum = 0;
int rightMax = 0, rightSum = 0;
int middle = 0;
middle = (left + right) / 2;
if (left == right)
return *(numArr + left);
maxLeft = maxSubsequence2(numArr, left, middle);
maxRight = maxSubsequence2(numArr, middle + 1, right);
for (int i = middle; i >= left; i--)
{
leftSum += *(numArr + i);
if (leftSum > leftMax)
leftMax = leftSum;
}
for (int i = middle+1; i <= right; i++)
{
rightSum += *(numArr + i);
if (rightSum > rightMax)
{
rightMax = rightSum;
}
}
return max3(leftMax,rightMax,leftMax+rightMax);
}
int maxSubSequence(int *numArr,int len) //算法复杂度 `O(N^2)`
{
int i, j;
int max = 0;
int sum = 0;
for (i = 0; i < len; i++)
{
sum = 0;
for (j = i; j < len; j++)
{
sum += *(numArr + j);
if (sum > max)
max = sum;
}
}
return max;
}
int max3(int a, int b, int c)
{
int max;
max = a > b ? a : b;
max = max > c ? max : c;
return max;
}
392

被折叠的 条评论
为什么被折叠?



