求连续区间的最大子序列和
问题
解下面一个事例例如,在一维数组的连续区间中找出其总和最大的连续区间。
例如: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;
}