//基础解法:O(n*n)
int maxSubSum(int array[],int length)
{
int i,j,sum=0,temp;
for(i=0;i<length;i++)
{
temp=0;
for(j=i;j<length;j++)
{
temp += array[j];
if(sum<temp){
sum = temp;
}
}
}
return sum;
}
//分治法
int FindMaxCrossSubarray(int array[], int start, int mid, int end) //跨越
{
int left_sum = 0;
int right_sum = 0;
int sum = 0;
int i;
for (i = mid; i >= start; i--) //左半部的最大子数组
{
sum += array[i];
if (sum >left_sum)
{
left_sum = sum;
}
}
sum = 0;
for (i = mid + 1; i <= end; i++) //右半部的最大子数组
{
sum += array[i];
if (sum > right_sum)
{
right_sum = sum;
}
}
return left_sum + right_sum;
}
int FindMaxSubarray(int array[], int start, int end)
{
int left_sum, right_sum, cross_sum;
if (end==start) //一个元素
{
return array[start];
}
else
{
int mid = (start+ end) / 2; //分治
left_sum = FindMaxSubarray(array, start, mid); //前半部
right_sum = FindMaxSubarray(array, mid + 1, end); //后半部
cross_sum = FindMaxCrossSubarray(array, start, mid, end); //跨越前后
if (left_sum >= right_sum && left_sum >= cross_sum) //最大子数组在左边
return left_sum;
else if (right_sum >= left_sum && right_sum >= cross_sum) //右边
return right_sum;
else //跨越
return cross_sum;
}
}
//动态规划:O(n)
int maxSubSum(int array[], int length) {
int Sum,MaxSum,j;
Sum=MaxSum=0;
for(j=0;j<length;j++)
{
Sum+=array[j];
if(Sum>MaxSum)
MaxSum=Sum;
else if(Sum<0)
Sum=0;
}
return MaxSum;
}
最大子数组
最新推荐文章于 2022-05-04 21:08:12 发布