数据结构之最大子串

数据结构之最大子串问题

给定整数串,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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值