求解最大子序列和问题的线性时间算法

来源:互联网 发布:淘宝网mac版下载 编辑:程序博客网 时间:2024/04/30 10:14

这个问题可以由动态规划的思想求解,MaxSum[i]=max(MaxSum[i-1]+data[i],data[i]),MaxSum[i]记录的是以data[i]为结尾的子序列的最大和。

代码:

#define mem(a) memset(a,0,sizeof(a))#define max(a,b) a>b?a:blong long MaxSum[100005];long long FindMaxmumSubArray(int * data, int size){long long ans=INT_MIN;mem(MaxSum);MaxSum[0] = data[0];for (int i = 1; i < size; i++){MaxSum[i] = max(MaxSum[i - 1] + data[i], data[i]);if (ans < MaxSum[i])ans = MaxSum[i];}return ans;}
时间复杂度为O(n)但额外花费了O(n)的空间复杂度。

但我们只是需要一个总的结果我们可以优化掉O(n)的时间复杂度,因为MaxSum[i]在第i+1次迭代之后就用不到了不需要再单独存储

long long FindMaxmumSubArray(int * data, int left, int right){long long ThisSum = 0, MaxSum = 0;for (int i = left; i <= right; i++){ThisSum += data[i];if (ThisSum > MaxSum)MaxSum = ThisSum;else if (ThisSum < 0)ThisSum = 0;}return MaxSum;}



阅读全文
1 0
原创粉丝点击