您的位置:首页 > 其它

文章标题

2015-08-18 14:59 330 查看

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

问题

解下面一个事例例如,在一维数组的连续区间中找出其总和最大的连续区间。

例如: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: