求元素和最大的子陣列

2022-05-03 06:06:08 字數 1029 閱讀 1127

1.題目要求:任意給出乙個整數的陣列,求出元素和最大的子陣列的和。要求時間複雜度為n。

2.解析題目要求:

要求出乙個陣列的最大子陣列和,若要求時間複雜度為n²,則可一一求出,再求其最大值,利用兩次迴圈即可。但是若要求時間複雜度為n,只能進行一次遍歷,這便是難點所在。關鍵點在於負數,若全為正數,那麼顯然最大子陣列就是陣列本身,所以負數便是分割點,例如,隨便列舉連續的陣列元素1,3,-1,……顯然前兩個數加上乙個負數之後陣列和變小,但是這並不能證明前兩個數就可以從-1這裡斷開因為1+3-1>0,所以需要繼續向後相加,例如若第四個數為2,顯然1+3-1+2>1+3;所以只有當向後加到和小於0時才能在那個負數的地方斷開。

3.程式設計思路:

從第乙個正數開始依次往後相加(若全為負數最大子陣列和就是最大的那個負數) 相加後會遇到三種情況 (1)max+a[i]>=max 此時可以得知a[i]為正數,可以繼續往後相加 (2)max+a[i]<=0 此時可以證明a[i]不但是負數,也是分割點,下一組最大陣列和應從i後面第乙個大於0的數開始 (3)若max+a[i]>0&&max+a[i]4.源**:

public class maxintarray ;

int max=new int[10];

max[0] = 0;

int i = 0;//陣列下標

int j = 0;//最大值陣列下標

int temp=0;//中間變數

while(i=max[j])

else if(temp+a[i]0)

else if(temp+a[i]<=0)

}int max = max[0];

for(int k=0;k<=j;k++)

} /*system.out.println(j);

for(int k=0;k<=j;k++)*/

system.out.println("最大子陣列和為"+max);

}}

5.執行結果截圖:

演算法很關鍵!有乙個靈活的大腦引導出乙個簡潔的演算法就能節省大量程式執行記憶體和程式設計量!

遞迴演算法求最大的子陣列的和

題目 輸入乙個整形陣列,陣列裡有正數也有負數。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值。例如輸入的陣列為1,2,3,10,4,7,2,5,和最大的子陣列為3,10,4,7,2,因此輸出為該子陣列和18以及起始的下標2,6。分治策略,執行時間是nlogn...

求列表最大元素不用max 連續子陣列的最大和

題目 輸入乙個整型陣列,陣列中的乙個或連續多個整數組成乙個子陣列。求所有子陣列的和的最大值。要求時間複雜度為o n 示例1 輸入 nums 2,1,3,4,1,2,1,5,4 輸出 6 解釋 連續子陣列 4,1,2,1 的和最大,為 6。動態規劃是本題的最優解法 設動態規劃列表 dp dp i 代表...

求整數陣列中和最大的子陣列的和

鄭雲飛 韓亞華 這個問題的複雜性和不確定讓我們讓我們想到了列舉,求出每乙個子陣列的和,但這樣我們我們程式的時間複雜度 將會非常高,於是我們想把辦法簡化它。首先我們將陣列裡連續的正數和負數就和,這樣我們將得到乙個正負相間的 整數陣列。然後再對正整數陣列求最大子陣列,這樣最大子陣列必定是兩頭為正,有奇數...