問題描述:
Find the contiguoussubarray within an array (containing at least one number) which has the largestsum.
For example, given the array [−2,1,−3,4,−1,2,1,−5,4]
,
the contiguous subarray [4,−1,2,1]
has the largest sum = 6
.
問題分析:
《劍指Offer》題31
輸入一個整型數組,整型數組裏有正數也有負數。數組中一個或連續多個正數組成一個子數組。要求所有子數組的和的最大值。(時間複雜度爲O(n))
顯然,一個數值加上一個負值,所得到的結果自然小於其本身。
使用一個curSum變量來記錄當前所考察的子數組的當前和,curMax變量來記錄當前所得到的最大值;
遍歷數組,若curSum爲負值,則加上當前值num[i],所得到的和一定小於num[i],則直接將前面的子數組捨棄,取當前值爲下一個繼續考察的子數組的起點,則curSum=nums[i];
若curSum爲正值,可想而知,直接加上num[i]會得到更大值;
比較當前獲得的curSum與之前獲得的最大值,每一步都得到當前的最大值,則最終獲得的最大值即爲curMax所記錄的值。
代碼:
public class Solution {
public int maxSubArray(int[] nums) {
// 消除不合法情況
if ((nums == null) || (nums.length == 0))
return 0;
// 初始化
int curSum = nums[0]; // 記錄當前的子數組的Sum總和
int curMax = nums[0]; // 記錄當前的最大Sum值
// 進行遍歷
for (int i = 1; i < nums.length; i++) {
// 因爲若之前的子數組的和小於0,加上當前值只會讓總值Sum減小,故選擇丟棄之前值
if (curSum <= 0) curSum = nums[i];
else curSum += nums[i];
// 判斷是否大於之前的最大值
if (curSum > curMax) curMax = curSum;
}
return curMax;
}
}