最大子数组,即子数组中的各个元素相加的和是所有子数组中最大的。
假设最大子数组为【ai.......aj】
则必然是以下三种情况:
(1)、完全位于子数组A【low.........mid】中
(2)、完全位于子数组A【mid+1.......high】中
(3)、跨越了中点low<=i<=mid<=j<=high
如果暴力求解的话,时间复杂度为:Θ(n²):
int find_max_subarray(int *arr, int len) {
int max_sum = arr[0];
for (int i = 0; i < len; i++) {
int sum = 0;
for (int j = i; j < len; j++) {
sum += arr[j];
if (sum > max_sum)
max_sum = sum;
}
}
return max_sum;
}
如果用分治法的话,将会简单很多,时间复杂度为:O(nlgn)
代码如下:
package lianxi;
public class max_ziarray {
public static int cross_subbary(int[] nums,int low,int mid,int high)
{
int sum,sum1,sum2,left_sum,right_sum;
sum1=0;
sum2=0;
left_sum=-9999;
right_sum=-9999;
for(int i=mid;i<=high;i++)
{
sum1+=nums[i];
if(sum1>right_sum)
right_sum=sum1;
}
for(int j=mid-1;j>=0;j--)
{
sum2+=nums[j];
if(sum2>left_sum)
left_sum=sum2;
}
sum=left_sum+right_sum;
return sum;
}
public static int maxium_subbary(int[] nums,int low,int high)
{
if(low==high)
return nums[low];
else
{
int mid=(low+high)/2;
int left_sum=maxium_subbary(nums, low, mid);
int right_sum=maxium_subbary(nums, mid+1, high);
int maxum=cross_subbary(nums, low, mid, high);
return Math.max(left_sum, Math.max(right_sum, maxum));
}
}
public static void main(String[] args)
{
int[] nums={13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7};
int low=0;
int high=nums.length-1;
int max;
max=maxium_subbary(nums, low, high);
System.out.println(max);
}
}
输出结果为:43