題意描述:
輸入一個整型數組,數組裏有正數也有負數。數組中的一個或連續多個整數組成一個子數組。求所有子數組的和的最大值。 要求時間複雜度爲O(n)。
1 <= arr.length <= 10^5
-100 <= arr[i] <= 100
示例:
輸入: nums = [-2,1,-3,4,-1,2,1,-5,4]
輸出: 6
解釋: 連續子數組 [4,-1,2,1] 的和最大,爲 6。
解題思路:
代碼:
Python 方法一: 動態規劃。
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
ret = nums[0]
pre = 0
for x in nums:
if pre <= 0: // 往者皆可拋,以上一個數字爲結尾的子數組的和已經小於等於0了,重新開始
pre = x
else:
pre += x // 繼續累積
if pre > ret: // 從 n 個“最大值”中挑出一個最大的
ret = pre
return ret
Java 方法一: 動態規劃。
class Solution {
public int maxSubArray(int[] nums) {
int ret = nums[0];
int pre = 0;
for(int i=0; i<nums.length; ++i){
if(pre <= 0){
pre = nums[i];
}else{
pre += nums[i];
}
if(pre > ret){
ret = pre;
}
}
return ret;
}
}
易錯點:
- 一些測試用例:
[-2,1,-3,4,-1,2,1,-5,4]
[1,2,3,4,3,4]
[-2,-1,-2]
[1,-1]
[2]
- 答案:
6
17
-1
1
2
總結: