自己编的求最大子段和方法C++代码
对数组arr[n]分别进行正向和反向累加求和,并求两过程的最大值sum1和sum2,并记录最大时的下标,正向为记为a,逆向记为b,则arr[b]至arr[a]的和即为所求。
其算法复杂度为O(2n),高于动态规划法,低于蛮力法。
#include <iostream>
#include <stdlib.h>
using namespace std;
int *maxSum(int a[], int len){
int sum = 0;
int max = a[0];
int i, *index;
index = (int *)malloc(sizeof(int)*3); //申请空间
for(i=0; i<len; i++){ //从a[0]开始累加,找sum最大情况
sum+=a[i];
if(max<sum){
max=sum;
index[1] = i; //最大字段的右端下标
}
}
max = a[len-1];
for(i=len-1; i>=0; i--){ //从a[i]倒序累加,找sum最大情况
sum+=a[i];
if(max<sum){
max=sum;
index[2] = i; //最大字段的左端下标
}
}
max = 0;
//cout << "index[1]:" << index[1] << endl << "index[2]:" << index[2] << endl;
for(i=index[2]; i<=index[1]; i++)
max+=a[i]; //最大子段和
for(i=index[2]; i<=index[1]; i++){
if(max<sum){
cout << "一次求解失败,需要递归求解" << endl;
return 0;
}
index[0] = max;
}
return index;
}
int main()
{
int a[6] = {-20, 11, -4, 13, -5, -2};
int *max;
max = maxSum(a, 6);
Q
cout << "最大子段和是:" << max[0] << endl;
cout << "Start:" << max[2]+1 << endl;
cout << "End:" << max[1]+1 << endl;
return 0;
}
注:这种方法是我无意间想出来的,能力有限,不会证明,故不敢称其为算法;这个想法想必前人已经提出来过,其正确性或许已被证明,博主才疏学浅,不得知。