求数组中连续最大子序列的和
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;
}
}