描述
輸入一個整型數組,數組裡有正數也有負數。數組中的一個或連續多個整數組成一個子數組。求所有子數組的和的最大值。要求時間複雜度為 O(n).
示例1
輸入: [1,-2,3,10,-4,7,2,-5]
傳回值: 18
說明:輸入的數組為{1,-2,3,10,—4,7,2,一5},和最大的子數組為{3,10,一4,7,2},是以輸出為該子數組的和 18。
思路
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL0ZUbj5WOtN2d5YkYvR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLzAjZwMjYmRmZjFTZ0I2N5gjYhRDN2QTOmFDMlZ2NwkzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
直接用簡化動态規劃,使用一個變量sum來表示目前連續的子數組和,以及一個變量res來表示中間出現的最大的和。
時間複雜度O(n),空間複雜度O(1)
代碼
public class Solution {
public int FindGreatestSumOfSubArray(int[] array) {
if (array == null || array.length == 0) {
return 0;
}
//res表示所有子數組的和的最大值
int res = array[0];
//sum表示包含目前連續的子數組和
int sum = array[0];
for (int i = 1; i < array.length; ++i) {
sum = max(sum + array[i], array[i]);
res = max(res, sum);
}
return res;
}
private int max(int i, int j) {
return i > j ? i : j;
}
}