问题:寻找A的和最大的非空连续子数组。例如,{1,-5,4,-6,2,3,7,-4,9,-3}的最大子数组为{2,3,7,-4,9}
分析:采用分治技术来求解最大子数组问题。假定我们要寻找子数组A[low,high]的最大子数组。使用分治技术意味着我们要将子数组划分为两个规模尽量相等的子数组。
A[low...high]的任何连续子数组A[i...j]所处位置必然是一下三种情况之一:
1.完全位于子数组A[low...mid]中,因此low<=i<=j<=mid。
2.完全位于子数组A[mid+1...high]中,因此mid<i<=j<=high。
3.跨越了中点,因此low<=i<=mid<=j<=high。
我们可以很容易的求出跨越中点的最大子数组。
struct result Find_Max_Crossing_SubArray(int A[], int low, int mid, int high)
{
struct result myResult;
int left_sum = -10000;
int sum = 0;
for(int i = mid; i >= low; i--)
{
sum = sum + A[i];
if(sum > left_sum)
{
left_sum = sum;
myResult.max_left = i;
}
}
int right_sum = -10000;
sum = 0;

本文介绍了如何运用分治策略解决C++中的最长子数组问题。通过将数组划分为两个相等大小的部分,分析了三种可能的情况,并提供了跨越中点的最大子数组的解决方案。文章最后展示了一段实现分治算法的完整代码。
最低0.47元/天 解锁文章
3万+

被折叠的 条评论
为什么被折叠?



