您的位置:首页 > 理论基础 > 数据结构算法

找出一串数字中的最大和子串

2016-11-15 10:36 375 查看

Olg(N)方法:分治的思想

将问题分成两个相等的问题,即将要求解的串分解为2个,然后分别求解

O(N)方法:直接遍历求解

对于和小于0的子串,直接舍弃,然后继续遍历求解

代码

#include<iostream>
#include<exception>
#include<fstream>
#include<sstream>
#include<string>
#include<vector>
#include<iterator>
#include<list>
#include<deque>
#include<stack>
#include<queue>
#include<concurrent_priority_queue.h>
#include<algorithm>
#include<numeric>
#include<functional>  //bind
#include<map>
#include<set>
#include<unordered_map>
#include<memory>
#include<assert.h>
#include<tuple>
#include<regex>

using namespace std;

template<typename T>
T max3(const T &v1, const T &v2, const T &v3)
{
T res = v1;
if (res < v2)
res = v2;
if (res < v3)
res = v3;
return res;
}

template<typename T>
T maxSumRec(const vector<T> &a, int left, int right)
{
if (left == right)
return a[left] > 0 ? a[left] : 0;

int center = (left + right) / 2;
int maxLeftSum = maxSumRec(a, left, center);
int maxRightSum = maxSumRec(a, center+1, right);

int maxLeftBorderSum = 0, leftBorderSum = 0;
for (int i = center; i >= left; i--)
{
leftBorderSum += a[i];
if (leftBorderSum > maxLeftBorderSum)
maxLeftBorderSum = leftBorderSum;
}

int maxRightBorderSum = 0, rightBorderSum = 0;
for (int i = center+1; i <= right; i++)
{
rightBorderSum += a[i];
if (rightBorderSum > maxRightBorderSum)
maxRightBorderSum = rightBorderSum;
}

return max3(maxLeftBorderSum+maxRightBorderSum, maxLeftSum, maxRightSum);

}

template<typename T>
T MaxSubArrray(const vector<T> &v)
{
return maxSumRec(v, 0, v.size() - 1);
}

template<typename T>
T maxSubArray_On(const vector<T> &v)
{
T maxSum = 0, thisSum = 0;
for (int i = 0; i < v.size(); i++)
{
thisSum += v[i];
if (thisSum > maxSum)
maxSum = thisSum;
if (thisSum < 0)
thisSum = 0;
}
return maxSum;
}

int main()
{
cout << "start!" << endl;

vector<double> a = {4, -3, 5, -2, -1, 2, 6, -2};
cout << MaxSubArrray(a) << endl;
cout << maxSubArray_On(a) << endl;

cout << "end!" << endl;
system("pause");
return EXIT_SUCCESS;
}


* 利用模板,针对不同的可以求和与比较的数据类型均可以求解
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐