题目:
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
.
题目要求我们从给定的序列中选出一个连续的子序列,使其中所有数字的和为所有连续子序列的数字之和的最大值。用分治算法,可以将给定的序列分成两半,此时将出现三种情况,最大子序列和出现在数组的前半部分,最大子序列和出现在数组的后半部分,最大子序列和出现在一个横跨数组中心点的子序列中,所以先递归求出前后两部分的最大子序列和,再求出一个横跨中心点的最大子序列和,三者中的最大值就是函数返回的结果。
程序:
int maxSubArray(int* nums, int numsSize) {
if(numsSize == 1)
return *nums;
else
{
int leftMax = maxSubArray(nums,numsSize / 2);
int rightMax = maxSubArray(nums + numsSize / 2,numsSize - numsSize / 2);
int i = numsSize / 2 - 1;
int j = i + 1;
int tempLeft = 0;
int tempRight = 0;
int maxLeft = nums[i];
int maxRight = nums[j];
while(i >= 0)
{
tempLeft += *(nums + i);
if(tempLeft > maxLeft)
maxLeft = tempLeft;
i--;
}
while(j < numsSize)
{
tempRight += *(nums + j);
if(tempRight > maxRight)
maxRight = tempRight;
j++;
}
int middleMax = maxLeft + maxRight;
if(leftMax > rightMax)
return leftMax > middleMax ? leftMax : middleMax;
else
return rightMax > middleMax ? rightMax : middleMax;
}
}