暴力 n*n;分治 n*lgn;贪心 n;
#include<iostream>
using namespace std;
//暴力算法 n*n
void NO_1(int &left,int &right,int length,int &sum_,int array[])
{
int sum=0,max=0;
for(int i=0;i<length;i++)
{
for(int j=i;j<length;j++)
{
sum +=array[j];
if(sum>=max)
{
max=sum;
left=i;
right=j;
}
}
sum=0;
}
sum_=max;
}
//分治 n*lgn
void NO_2(int &left, int &right, int &sum_, int array[])
{
if(left==right)
{
sum_=array[left];
return;
}
int sum_l=0,sum_r=0,sum_m=0;
int mid=(right+left)/2;
int left_l=left, right_l=mid;
NO_2(left_l,right_l,sum_l,array);
int left_r=mid+1, right_r=right;
NO_2(left_r,right_r,sum_r,array);
int max_left=-9999,sum_left=0,left_m=0;
for(int i=mid;i>=left;i--)
{
sum_left +=array[i];
if(sum_left>max_left)
{
max_left=sum_left;
left_m =i;
}
}
int max_right=-9999,sum_right=0,right_m=0;
for(int i=mid+1;i<=right;i++)
{
sum_right +=array[i];
if(sum_right>max_right)
{
max_right=sum_right;
right_m=i;
}
}
sum_m=max_left+max_right;
if(sum_l>=sum_r && sum_l>=sum_m)
{
sum_=sum_l;
left=left_l; right=right_l;
return;
}
else if(sum_r>=sum_l && sum_r>=sum_m)
{
sum_=sum_r;
left =left_r; right=right_r;
return;
}
else
{
sum_=sum_m;
left=left_m; right=right_m;
return;
}
}
//贪心 n
void NO_3(int &left,int &right,int length,int &max_sum,int array[])
{
max_sum=-9999 ;
int left_1=0,right_1=0;
int sum=0;
for(int i=0;i<length;i++)
{
sum +=array[i];
if(sum<0)
{
sum=0;
left_1=right_1=i+1;
}
else if(sum>max_sum)
{
right_1=i;
left=left_1;
right=right_1;
max_sum=sum;
}
}
}
int main()
{
int array[11]={2,3,-7,-1,10,2,-4,3,-16,16,2};
int left=0,right=0,length=11,sum=0;
NO_1(left,right,length,sum,array);
cout<<"NO_1: "<<"left:"<<left<<" right:"<<right<<" sum:"<<sum<<endl;
left =0; right =10; sum=0;
NO_2(left,right,sum,array);
cout<<"NO_2: "<<"left:"<<left<<" right:"<<right<<" sum:"<<sum<<endl;
left =0; right =10; sum=0;
NO_3(left,right,length,sum,array);
cout<<"NO_3: "<<"left:"<<left<<" right:"<<right<<" sum:"<<sum<<endl;
return 0;
}