题目描述:
输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
要求时间复杂度为O(n)。
示例1:
输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
提示:1 <= arr.length <= 10^5
-100 <= arr[i] <= 100
参考解题思路:动态规划,不同位置数字a[i]代表0...i上最大连续子序列和,a[0]=arr[0]设置一个最大值max,初始值为数组中的第一个数字。当进来一个新的数字arr[i+1]时,判断到他前面数字子序列和a[i]+arr[i+1]跟arr[i+1]哪个大,前者大就保留前者,后者大就说明前面连续数字加起来都不如后者一个新进来的数字大,前面数字就可以舍弃,从arr[i+1]开始,每次比较完都跟max比较一下,最后的max就是最大值。
public int maxSubArray(int[] nums) {
if (nums.length == 1) {
return nums[0];
}
int sumMax = nums[0];
int sumNow = nums[0];
for (int i = 1; i < nums.length; i++) {
sumNow = Math.max(sumNow + nums[i], nums[i]);
if (sumNow >= sumMax) {
sumMax = sumNow;
}
}
return sumMax;
}
复杂度分析:
时间复杂度 O(N): 线性遍历数组 nums 即可获得结果,使用 O(N) 时间。
空间复杂度 O(1): 使用常数大小的额外空间。