一個整形陣列中有正數也有負數,陣列中連續一個或多個組成子陣列,每個子陣列都有一個和,求所有子陣列中和的最大值
阿新 • • 發佈:2019-02-15
本文只作為學習筆記,如若侵權請告知,一定及時刪除
題目
輸入一個整型陣列,數組裡有正數也有負數。陣列中一個或者連續的多個整陣列成一個字陣列。求所有字陣列的和的最大值。要求時間複雜度為O(n)。例如輸入的陣列為1, -2, 3, 10, -4, 7, 2, -5,和最大的子陣列為3, 10, -4, 7, 2,因此輸出為該子陣列的和18
思路
因為時間複雜度為O(n),則只能遍歷一次陣列,這裡同時使用兩個變數sum和max,其中sum儲存的是當前的和,若sum<0,則從下一個位置從新記錄,max記錄的是歷史的最大值,只有當sum>max時用sum替換max。
程式碼
public class Item {
public static void main(String args[]) {
int array[] = {1, -2, 3, 10, -4, 7, 2, -5};
System.out.println(findMax(array));
}
public static int findMax(int array[]){
//加上約束條件,防止當陣列為空時造成陣列越界
if (array.length == 0) {
return 0;
}
int max = array[0];
int sum = 0;
for(int i=0; i<array.length; i++){
//如果加上某個元素sum>=0的話,就加;
//當陣列全為負數的時候只要有加法就一定比原來的數小,此時就相當於找出陣列內最大的數
if(sum >= 0) {
sum += array[i];
}
else{
sum = array[i]; //否則從當前位置重新計算
}
if(sum > max){
max = sum;
}
}
return max;
}
}