1. 程式人生 > >劍指offer第二版面試題42:連續子陣列的最大和(java)

劍指offer第二版面試題42:連續子陣列的最大和(java)

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

}