您的位置:首页 > 编程语言 > C语言/C++

最大连续子数组

2017-03-13 16:57 323 查看

最大连续子数组

最大连续子数组问题是在数组A中确定和为最大的连续子数组问题。

编译环境:VS2013

对于该类问题一般采用分治策略,采用递归的方式求解。

在数组中A中存在最大连续子序列可以分为三种情况:

最大子序列在数组A的左半部分即在A[Left, Mid], Left<=i<=j <=Mid;

最大子序列在数组A的右半部分即在A[Mid+1, right]; Mid+1<=i<=j <=Right;

最大子序列在数组A的交叉部分即在 i<=Mid<=j;

在这里,可以使用递归的方法来进行,下面的图为递归算法



在进行完递归分解后,应该对子序列进行比较合并,如下伪代码即为合并算法





经过合并后便可找出最大连续子序列了。下面是最长公共子序列的c/c++代码

vector<int> findMaxCrossingSubarray(vector<int>& vNum, int left, int mid, int right){
int leftNum = INT_MIN;
int sum=0;
int leftId = mid;
for (int i = mid; i >= left; --i){
sum += vNum.at(i);
if (sum > leftNum){
leftNum = sum;
leftId = i;
}
}
sum = 0;
int rightNum = INT_MIN;
int rightId = mid + 1;
for (int i = mid + 1; i <= right; ++i){
sum += vNum.at(i);
if (sum > rightNum){
rightNum = sum;
rightId = i;
}
}

vector<int> Id;
Id.push_back(leftId);
Id.push_back(rightId);
Id.push_back(rightNum + leftNum);

return Id;
}

vector<int> findMaximumSubarray(vector<int>& vNum, int left, int right){
vector<int> Id;
if (left == right){
Id.push_back(left);
Id.push_back(right);
Id.push_back(vNum.at(left));
return Id;
}else{
vector<int> vLeft, vRight, vMid;
int mid = (left + right) / 2;
vLeft = findMaximumSubarray(vNum, left, mid);
vRight = findMaximumSubarray(vNum, mid + 1, right);
vMid = findMaxCrossingSubarray(vNum, left, mid, right);
if (vLeft.at(2) >= vRight.at(2) && vLeft.at(2) >= vMid.at(2))Id= vLeft;
if (vRight.at(2) >= vLeft.at(2) && vRight.at(2) >= vMid.at(2)) Id= vRight;
if (vMid.at(2) >= vLeft.at(2) && vMid.at(2) >= vRight.at(2)) Id= vMid;
}
return Id;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息