最大连续子数组

来源:互联网 发布:兄弟连nginx视频教程 编辑:程序博客网 时间:2024/06/05 05:53

输入一个数组,输出最大连续子数组区间,以及最大连续子数组和的值

#include <iostream>#include <limits>using namespace std;const int MIN=1<<(sizeof(int)*8-1);    //  int MIN=numeric_limits<int>::min();const int MAX=-(1<<(sizeof(int)*8-1)+1);  //  int MAX=numeric_limits<int>::max();struct MAX_ARRAY{    int left;    int right;    int sum;}LEFT,RIGHT,MIDDLE;MAX_ARRAY FIND_MAX_CROSSING_SUBARRAY(int a[],int left,int mid,int right){    int left_sum=MIN,right_sum=MIN;    int sum=0;    int max_left=-1,max_right=-1;    for(int i=mid;i>=left;i--)    {        sum+=a[i];        if(left_sum<=sum)        {            left_sum=sum;            max_left=i;        }    }    sum=0;    for(int i=mid+1;i<=right;i++)    {        sum+=a[i];        if(right_sum<=sum)        {            right_sum=sum;            max_right=i;        }    }    MIDDLE.left=max_left;    MIDDLE.right=max_right;    MIDDLE.sum=left_sum+right_sum;    return MIDDLE;}MAX_ARRAY FIND_MAX_SUBARAY(int a[],int left,int right){    if(left==right)    {        LEFT.left=left;        LEFT.right=right;        LEFT.sum=a[left];        return LEFT;    }    else    {        int mid=(left+right)/2;        LEFT=FIND_MAX_SUBARAY(a,left,mid);        RIGHT=FIND_MAX_SUBARAY(a,mid+1,right);        MIDDLE=FIND_MAX_CROSSING_SUBARRAY(a,left,mid,right);        if(LEFT.sum > RIGHT.sum && LEFT.sum > MIDDLE.sum) return LEFT;        else if(RIGHT.sum > LEFT.sum && RIGHT.sum > MIDDLE.sum) return RIGHT;        else return MIDDLE;    }}int main(int argc, char *argv[]){//    int a[]={13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7};    int n;    cin>>n;    int a[n];    for(int i=0;i<n;i++) cin>>a[i];    MAX_ARRAY test;    test=FIND_MAX_SUBARAY(a,0,n-1);    cout<<test.left<<" "<<test.right<<" "<<test.sum<<endl;    return 0;}
原创粉丝点击