53. Maximum Subarray

来源:互联网 发布:知乎 家族显赫 编辑:程序博客网 时间:2024/06/07 18:22

求数组中连续最大子序列的和

 Find the contiguous subarray within an array (containing at least one number) which has the largest sum.

For example, given the array [-2,1,-3,4,-1,2,1,-5,4],
the contiguous subarray [4,-1,2,1] has the largest sum = 6


public class Solution {    public int maxSubArray(int[] nums) {        //分而治之的思想        return maxSubArray(nums,0,nums.length-1);    }    public int maxSubArray(int[] A,int start,int end){        //如果开始大于结束,就返回Integer.MIN_VALUE;        if(start>end)return Integer.MIN_VALUE;        //mid即为中间元素。        int mid=(start+end)/2;        //得到左边最大值        int leftMax=maxSubArray(A,start,mid-1);        //得到右边最大值        int rightMax=maxSubArray(A,mid+1,end);        int lMaxSum=0;        int sum=0;        //对每个子序列做左边求和        for(int i=mid-1;i>=start;i--){            sum+=A[i];            lMaxSum=Math.max(sum,lMaxSum);        }        int rMaxSum=0;        sum=0;        //对每个子序列做右边求和        for(int i=mid+1;i<=end;i++){            sum+=A[i];            rMaxSum=Math.max(rMaxSum,sum);        }        //比较左边最大、右边最大和包括中间元素的最大的连续序列        return Math.max(lMaxSum+A[mid]+rMaxSum,Math.max(leftMax,rightMax));    }}
解法2:

采用最优连续序列化值保存方法。

public class Solution {    public int maxSubArray(int[] nums) {        //从第一位计算,假设目前最大和是第一个数。        int far_now_max=nums[0],mostRealMax=nums[0];        //遍历序列,从第二个元素开始遍历,        for(int i=1;i<nums.length;i++){            //far_now_max记录到达i连续序列和,与最近一个nums[i]比较,始终记录已有序列的最大和。            far_now_max=Math.max(far_now_max+nums[i],nums[i]);            //将每次nums[i]结束的序列和与mostRealMax比较,如果比mostRealMax值大,就更新mostRealMax的值。            mostRealMax=Math.max(far_now_max,mostRealMax);        }        return mostRealMax;    }}


原创粉丝点击