1. 程式人生 > >一個整形陣列中有正數也有負數,陣列中連續一個或多個組成子陣列,每個子陣列都有一個和,求所有子陣列中和的最大值

一個整形陣列中有正數也有負數,陣列中連續一個或多個組成子陣列,每個子陣列都有一個和,求所有子陣列中和的最大值

本文只作為學習筆記,如若侵權請告知,一定及時刪除

題目

輸入一個整型陣列,數組裡有正數也有負數。陣列中一個或者連續的多個整陣列成一個字陣列。求所有字陣列的和的最大值。要求時間複雜度為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; } }