最大连续子数组
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; }