Maximum Subarray

先用一种类似动态规划的蛮力法,超时了:

public int maxSubArray(int[] nums) {
    int sum=nums[0];
    for (int i = 1; i < nums.length; i++) {
        int temp = 0;
        for (int j = i; j >= 0; j--) {
            temp+=nums[j];
            if(temp>sum)
                sum=temp;
        }
    }
    return sum;
}

后来想到了二分法。
这个最大值要么包括nums[mid],要么就是在mid的左边或者右边。
要考虑到细节,不然就会出错!

public int maxSubArray(int[] nums) {
    return findMaxSub(nums, 0, nums.length-1);
}

public int findMaxSub(int[] nums,int left,int right){
    if(left==right)
        return nums[left];
    if(left>right)
        return Integer.MIN_VALUE;
    int mid=(left+right)/2,midSum=nums[mid];
    int midLeft=mid-1,midLeftsum=0,leftSum=Integer.MIN_VALUE;
    while(midLeft>=left){
        midLeftsum+=nums[midLeft--];
        if(midLeftsum>leftSum)
            leftSum=midLeftsum;
    }
    int midRight=mid+1,midRightSum=0,rightSum=Integer.MIN_VALUE;
    while(midRight<=right){
        midRightSum+=nums[midRight++];
        if(midRightSum>rightSum){
            rightSum=midRightSum;
        }
    }
    if(leftSum>0)
        midSum+=leftSum;
    if(rightSum>0)
        midSum+=rightSum;    //这里不是简单的直接用midSum+leftSum+rightSum
    int leftMaxSub=findMaxSub(nums, left, mid-1);
    int rightMaxSub=findMaxSub(nums, mid+1, right);
    return Integer.max(Integer.max(leftMaxSub, rightMaxSub),midSum);
}

你可能感兴趣的:(java,array,二分法)