输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
要求时间复杂度为O(n)。
示例1:
输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
解题思路
对于一个数组,最大和的连续子数组可以由3种情况得来,设数组的中间元素为mid,mid元素把原数组分隔为了左右两个部分
- mid元素向左右两边找最大的连续子数组
- 左部分数组的连续子数组的最大和
- 右部分数组的连续子数组的最大和
因此,只需要选出这三个部分中的最大值即可
代码
class Solution {public int maxSubArray(int[] nums) {return div(nums,0,nums.length-1);}public int div(int[] nums,int l,int r) {if (l>r) return 0;int mid=(r-l)/2+l;int left=div(nums, l, mid-1),right=div(nums, mid+1, r);int lMax=0,rMax=0,lSum=0,rSum=0;for (int i=mid-1;i>=l;i--){lSum+=nums[i];lMax= Math.max(lMax,lSum);}for (int i=mid+1;i<=r;i++){rSum+=nums[i];rMax= Math.max(rMax,rSum);}int res=lMax+rMax+nums[mid];if(l<=mid-1)res= Math.max(res,left);if(r>=mid+1)res=Math.max(res,right);return res;}
}