一、題目要求:
輸入乙個一維整形陣列,陣列裡有正數也有負數。
一維陣列首尾相接,像個一條首尾相接帶子一樣。
陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值。
發表一篇部落格文章講述設計思想,出現的問題,可能的解決方案(多選)、源**、結果截圖、總結。
二、程式設計思想
對於乙個陣列來講,要想求最大的子陣列,是一件很簡單的事,但是一旦要求時間複雜度為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個元素開始小。相反,如果前...