给定一个整数数组 nums
,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
进阶:
如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。
使用的是分治的思想
class Solution {
public int maxSubArray(int[] nums) {
if(nums.length==0)
return 0;
return Maxplus(nums,0,nums.length-1);
}
private static int Maxplus(int[] nums,int begin,int end){
if(begin==end)
return nums[begin];
else if(begin==end-1){
if(nums[begin]>0 && nums[end]>0)
return nums[begin]+nums[end];
else
return nums[begin]>=nums[end] ? nums[begin]:nums[end];
}
else{
int mid=(begin+end)/2;
int sum1=Maxplus(nums,begin,mid);
int sum2=Maxplus(nums,mid,end);
int sum3;
int leftsum=Integer.MIN_VALUE;
int max1=0;
for(int i=mid;i>=begin;i--){
max1+=nums[i];
if(max1>leftsum)
leftsum=max1;
}
int rightsum=Integer.MIN_VALUE;
int max2=0;
for(int i=mid+1;i<=end;i++){
max2+=nums[i];
if(max2>rightsum)
rightsum=max2;
}
if(leftsum>0 && rightsum>0)
sum3=leftsum+rightsum;
else
sum3=leftsum>=rightsum ? leftsum:rightsum;
if(sum1>=sum2 && sum1>=sum3)
return sum1;
if(sum2>=sum1 && sum2>=sum3)
return sum2;
if(sum3>=sum1 && sum3>=sum2)
return sum3;
}
return 0;
}
}