最大连续子数组(分治法)
方法1:暴力求解
时间复杂度O(N^3)
/**
* 求解最大连续子数组:暴力求解,计算出每一个子数组的和,更新最大值
* @param nums
* @return
*/
public int maxAddSub(int[] nums){
int max = nums[0];
for(int i = 0;i<nums.length;i++){
for(int j = i;j<nums.length;j++){
int sum = 0;
for (int k = i;k<=j;k++){
sum +=nums[k];
}
if(sum > max){
max = sum;
}
}
}
return max;
}
方法2:分治法
时间复杂度:O(NlogN)
/**
* 求解最大连续子数组:分治法,递归
* @param nums
* @param from
* @param to
* @return
*/
public int maxAddSub(int[] nums,int from,int to){
//递归的终止条件
if(from == to){
return nums[from];
}
//递归的内容
int middle = from + (to - from)/2;
//最大连续子数组全部在左半部分子数组中
int max1 = maxAddSub(nums,from,middle);
//最大连续子数组全部在右半部分子数组中
int max2 = maxAddSub(nums,middle+1,to);
//最大连续子数组跨立在左半部分子数组和右半部分子数组中
//求解左半部分子数组的最大后缀和右半部分子数组的最大前缀
int leftMax = nums[middle];
int now = nums[middle];
for(int i =middle-1; i>= from ;i--){
now += nums[i];
leftMax = Math.max(leftMax,now);
}
int rightMax = nums[middle+1];
now = nums[middle+1];
for(int i = middle+2; i <= to;i++){
now += nums[i];
rightMax = Math.max(rightMax,now);
}
int max3 = rightMax+leftMax;
return Math.max(max1,Math.max(max2,max3));
}