子陣列的和的最大值(包括公升級版的首尾相連陣列)

2022-04-02 11:22:15 字數 2179 閱讀 5937

一、題目要求:

輸入乙個一維整形陣列,陣列裡有正數也有負數。

一維陣列首尾相接,像個一條首尾相接帶子一樣。

陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值。

發表一篇部落格文章講述設計思想,出現的問題,可能的解決方案(多選)、源**、結果截圖、總結。

二、程式設計思想

對於乙個陣列來講,要想求最大的子陣列,是一件很簡單的事,但是一旦要求時間複雜度為o(n)後,情況就不一樣了。

那麼怎麼做呢,首先對於乙個陣列有三種大的情況,一種是全是正的,一種是全是負的,另外一種是有正有負的,如果全是正的或全是負的,那麼很簡單,全是正的時候,全部相加就是子陣列和的最大值,全是負的時候,陣列中最大的那個數字就是子陣列的和的最大值。那麼有正有負的該怎麼做呢?

我就想到,申明乙個最大值陣列,temp變數作為中間值,如果發現當前的最大值與下乙個數相加之後大於零,那麼就令最大值等於最大值與下個數相加的和,如果小於最大值,並且大於0,那麼就用temp加上下乙個數,如果小於零,那麼就令temp=0,max陣列向後移一位,然後令該max重新等於零,一直重複此操作,最後在從max陣列裡找出最大的那個就是子陣列的和的最大值。

三、源**:

public

class

maxintarray ;

int max=new

int[5];

max[0] = 0;

int i = 0;//

陣列下標

int j = 0;//

最大值陣列下標

int temp=0;//

中間變數

while(i

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);}}

首尾相連的**:

public

class

max2 ;

int b=new

int[100];

int n=a.length;

for(int i=0;i)

int max=new

int[10];

max[0] = 0;

int i = 0;//

陣列下標

int j = 0;//

最大值陣列下標

int temp=0;//

中間變數

int q=1;//

用於連續長度的計數

while(qb.length)

else

if(temp+b[i]0)

else

if(temp+b[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);}}

四、程式結果截圖:

4組不同的測試用例:

首尾相連的測試用例:

五、總結:

乙個人的力量終究有限,這次作業我是和許磊共同完成的,在寫程式之前,我們經過了激烈的討論,以及相當長的時間的思考,最終解決了問題。

同時,我們也切實的體會到了合作所帶來的好處。

子陣列之和的最大值

給定乙個陣列,查詢這個陣列的子陣列的最大和 比如 2,5,3,6,4,8,6 輸出最大和8 分析 假設已經找到乙個子陣列的最大和,這個子陣列是從陣列索引i到索引j。可以用如下式子描述,cur max a i j 對於下乙個數,也就是索引為j 1,這個最大和是否 將a j 1 加入cur max,需要...

子陣列之和的最大值

感謝firo july 2010.06.05。algorithm 1 時間效率為o n n n intmaxsubsequencesum1 const inta,intn return maxsum algorithm 2 時間效率為o n n intmaxsubsequencesum2 const...

子矩陣和的最大值

本部落格只是為了記錄我剛了解的演算法思想。首先是考慮一維的情況 可以這樣想從第乙個元素掃到最後乙個,不斷的維護最大值sum。當掃到第 i 個元素的時候,子陣列的和要 麼加上這個元素,要麼從這個元素從新開始。當前面i 1的子陣列的和小於0,那麼加上第i個元素,會比直接用 第i個元素開始小。相反,如果前...