劍指offer第二版面試題42:連續子陣列的最大和(java)
阿新 • • 發佈:2019-01-30
題目描述:
輸入一個整型陣列,數組裡有正數也有負數。陣列中一個或連續的多個整陣列成一個子陣列。求所有子陣列的和的最大值。要求時間複雜度為O(n)。例如輸入的陣列為{1,-2,3,10,-4,7,2,-5},和最大的子陣列為{3,10,-4,7,2},因此輸出為該子陣列的和18。
分析思路:
Step1.從頭到尾逐個累加陣列中的每個數字,初始化和為0;(nCurrSum=0,nGreatestNum=int.MinValue)
Step2.首先加上第一個數字,從第二個數字開始累加,依次將累加和儲存到一個臨時變數(nCurrSum)中;
Step3.如果當前累加和(nCurrSum)小於0,那拋棄前面的子陣列和,從下一個數字開始重新累加;相反,則將當前累加和(nCurrSum)與返回累加和(nGreatestNum)進行比較,如果nCurrSum>nGreatestNum,則更新nGreatestNum。
這樣比較進行一次遍歷之後,就可以得到最終的最大累加和,時間複雜度是O(n)。下圖展示了計算陣列{1,-2,3,10,-4,7,2,-5}中子陣列的最大和的過程:
程式碼如下:
/**
* 連續子陣列的最大和
*/
public class MaxSum {
public boolean invalidInput = false; public int findGreatestSumOfArray(int[] array){ if(array == null || array.length == 0){ invalidInput = true; return 0; } //最大的子陣列和 int maxSum = array[0]; //累加的子陣列和 int curSum = array[0]; for(int i = 1; i < array.length; i++){ if(curSum < 0){ curSum = array[i]; }else{ curSum += array[i]; } if(curSum > maxSum){ maxSum = curSum; } } return maxSum; }
}