關於最大欄位和的若干解法和優化
阿新 • • 發佈:2018-12-11
最大欄位和是常見的一個入門演算法問題,根據演算法的優化程度,這裡分為了四種方法:
第一種:複雜度為O(N ^ 2),兩個用於語句巢狀
int summax_1(int *a,int tem) { int temp=0,temp_maxi=0,temp_maxj=0; for(int i=0;i<tem;i++) { temp=0; for(int j=i;j<tem;j++) { temp+=a[j]; if(temp>temp_maxj) temp_maxj=temp; } if(temp_maxj>temp_maxi) temp_maxi=temp_maxj; } return temp_maxi; }
第二種是分治法:
int summax_2(int *a,int l,int r) { int sum=0,suml=0,sumr=0,s1=0,s2=0,tem_r=0,tem_l=0; int tem=(r+l)/2; if(r==l) sum=(a[l]>0)?a[l]:0; else { suml=summax_2(a,l,tem); sumr=summax_2(a,tem+1,r); for(int i=tem;i>=l;i--) { tem_l+=a[i]; if(tem_l>s1) s1=tem_l; } for(int i=tem+1;i<r;i++) { tem_r+=a[i]; if(tem_r>s2) s2=tem_r; } sum=s1+s2; if(sum<suml) sum=suml; if(sum<sumr) sum=sumr; } return sum; }
第三種複雜度為O(N):
int summax_4(int *a,int n)
{
int sum=0,tem=0;
for(int i=0;i<n;i++)
{
if(tem>0)tem+=a[i];
else tem=a[i];
if(tem>sum) sum=tem;
}
return sum;
}