自己编的求最大子段和算法C++代码

自己编的求最大子段和方法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;
}

注:这种方法是我无意间想出来的,能力有限,不会证明,故不敢称其为算法;这个想法想必前人已经提出来过,其正确性或许已被证明,博主才疏学浅,不得知。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章