文章标题

来源:互联网 发布:win10多核优化 2017 编辑:程序博客网 时间:2024/04/29 03:39

求连续区间的最大子序列和

问题

解下面一个事例例如,在一维数组的连续区间中找出其总和最大的连续区间。
例如:input: [-7,4,-3,6,3,-8,3,4]
output: 10

方法

求最大子序列和是一个非常常见的问题,由于本人刚学习算法不久,只用常见的几种方法进行尝试。

穷举法

时间复杂度为O(N.^3)

穷举法,减去一些不必要比较

时间复杂度为O(N.^2)

分治法

时间复杂度为O(NlgN)

代码如下:

#include <iostream>#include <vector>#include <limits>using namespace std;const int MIN = numeric_limits<int>::min();//时间复杂度为O(N.^3)int inefficientMaxSum(vector<int>& A){    int N = A.size();    int ret = MIN;    for(int i = 0; i < N; i++)    {        for(int j=0; j < N; j++)        {            int sum = 0;            for(int k = i; k < j+1; k++)            {                sum += A[k];            }            ret = max(ret,sum);        }    }    return ret;}int betterMaxSum(vector<int>& A){    int N = A.size(),ret = MIN;    for(int i = 0;i < N;i++)    {        int sum = 0;        for(int j = i; j<N; j++)        {            sum +=A[j];            ret = max(ret,sum);        }    }    return ret;}int fastMaxSum(vector<int> &A,int lo, int hi){    if(lo == hi) return A[lo];    int mid = (lo + hi) / 2;    int leftSum = MIN, rightSum = MIN, sum = 0;    for(int i = lo; i <= mid; i++)    {        sum += A[i];        leftSum = max(leftSum,sum);    }    /*    for(int i = mid; i>= lo; --i)    {        sum += A[i];        leftSum = max(leftSum,sum);    }    */    sum = 0;    for(int j = mid+1; j <= hi; j++)    {        sum += A[j];        rightSum = max(rightSum,sum);    }    //return max(leftSum,rightSum);    int single = max(fastMaxSum(A,lo,mid),fastMaxSum(A,mid+1,hi));    return max(leftSum+rightSum,single);}int main(){    int a[8] = {-7,4,-3,6,3,-8,3,4};    vector<int> A;    for(int i=0; i<8; i++)    {        A.push_back(a[i]);    }    cout << "max_sum:" << inefficientMaxSum(A)<<endl;    cout <<"max_sum2:" << betterMaxSum(A) <<endl;    cout <<"max_sum3:" << fastMaxSum(A,0,7) <<endl;    cout << "Hello world!" << endl;    return 0;}
0 0