最大子串行和問題的四種求解以及他們的時間複雜度

2021-09-05 12:24:18 字數 1713 閱讀 8945

最大子串行求和的問題就是對於給定的整數數列(裡面可能有負數)a1,a2,…an,求ai到ak的和的最大值。

例如 -2,11,-4,13,-5,-2 這個數列的最大子串行和就是11-4+13=20。下面用四種方法實現這個功能。時間複雜度依次減小。

用三個for迴圈

public class maxsubsum ;

int maxsum=0,i,j,k;

for(i=0;imaxsum)}}

}system.out.println(maxsum);

}}

很顯然這個的時間複雜度是o(n3)

用兩個for迴圈,上面的第三個for是可以不用的

public class maxsubsum2 ;

int maxsum=0,i,j;

for(i=0;imaxsum)}}

system.out.println(maxsum);

}}

少了乙個for,時間複雜度為o(n2)

用遞迴,程式較多一點

public class maxsubsum3 

else

}int center=(left+right)/2;

int maxleftsum=maxsum(a,left,center); //左邊遞迴

int maxrightsum=maxsum(a,center+1,right); //右邊遞迴

int maxleftbodersum=0,leftbodersum=0;

for(int i=center;i>=left;i--)

}int maxrightbodersum=0,rightbodersum=0;

for(int i=center+1;i<=right;i++)

}return max(maxleftsum,maxrightsum,maxleftbodersum+maxrightbodersum);

}private int max(int x, int y, int z)

else

if(temp>z)

else

return result;

}/**

* @param args

*/public static void main(string args) ;

maxsubsum3 max=new maxsubsum3();

max.maxsum(a, 0, a.length-1);

system.out.println(max.maxsum(a, 0, a.length-1));

}}

這兩個for是找出含有中間項的和的最大值。這個演算法遞迴的是每次變成n/2,然後for迴圈的時間複雜度為o(n),整個演算法的時間複雜度是o(nlogn)。

最後乙個也是最優的演算法了吧 ,因為不需要知道這個子串行在**,只需要知道最後的值,子串行中第一項如果是負數那麼肯定不能是最大的了。

public class maxsubsum4

; int maxsum=0,thissum=0;

for(int i=0;imaxsum)

else if(thissum<0)

}system.out.println(maxsum);

}}

這個只有乙個for迴圈,所以時間複雜度為o(n)。

最大子串行和的四種求解方法

最大子串行和問題 include includeusing namespace std const int maxn 100 5 分治 int maxz int a,int x,int y 返回陣列左閉右開區間的最大和 v 0 r a m for int i m i y i return max m...

最大子串行和的四種演算法

1.窮舉法 演算法思想 算出每個子串行的和,即算出序列中第i個到第j個數的和 j i 並進行比較 演算法 public static int maxsubsum1 int a if sum maxsum return maxsum 執行時間為o n 3 2.對上述第乙個演算法的改進 演算法思想 第乙...

最大子串行和的四種演算法

算出每個子串行的和,即算出序列中第i個到第j個數的和 j i 並進行比較。執行時間為o n 3 maxsum 0 nums d n int input 輸入陣列長度 for i in range 0 n k int input 輸入資料 for i in range 0 len nums for j...