//解法一:分治classSolution{publicintmaxSubArray(int[] nums){returnmerge(nums,0, nums.length -1);}publicintmerge(int[] nums,int l,int r){if(l == r)return nums[l];int mid = l + r >>1;int leftSum =merge(nums, l, mid);int rightSum =merge(nums, mid +1, r);int CrossSum =Cross(nums, l, r, mid);return Math.max(leftSum, Math.max(rightSum, CrossSum));}publicintCross(int[] nums,int l,int r,int mid){if(l == r)return nums[l];int curSum =0;int left = Integer.MIN_VALUE;for(int i = mid; i >= l; i--){
curSum += nums[i];
left = Math.max(left, curSum);}int right = Integer.MIN_VALUE;
curSum =0;for(int i = mid +1; i <= r; i++){
curSum += nums[i];
right = Math.max(right, curSum);}return left + right;}}
//解法二:动态规划 最优解classSolution{publicintmaxSubArray(int[] nums){int n = nums.length;int ans = Integer.MIN_VALUE;if(n ==1)return nums[0];
ans = Math.max(ans, nums[0]);for(int i =1; i < n; i++){if(nums[i -1]>=0)
nums[i]+= nums[i -1];
ans = Math.max(ans, nums[i]);}return ans;}}
题解//解法一:分治class Solution { public int maxSubArray(int[] nums) { return merge(nums, 0, nums.length - 1); } public int merge(int[] nums, int l, int r){ if(l == r) return nums[l]; int mid = l + r >> 1;.