找出一串数字中的最大和子串
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; }
* 利用模板,针对不同的可以求和与比较的数据类型均可以求解
相关文章推荐
- 找出一串数字中,n个连续的数之和最大c++代码实例及运行结果
- 找出一串数字中,n个连续的数之和最大c++代码实例及运行结果
- 找出一串数字中,n个连续的数之和最大c++代码实例及运行结果
- 找出一串数字中,n个连续的数之和最大c++代码实例及运行结果
- 找出一串数字中,n个连续的数之和最大c++代码实例及运行结果
- 找出一串数字中,n个连续的数之和最大c++代码实例及运行结果
- 1、 输入一串字符,只包含“0-10”和“,”找出其中最小的数字和最大的数字(可能不止一个),输出最后剩余数字个数。
- 输入一串字符,只包含“0-10”和“,”,找出其中最小的数字和最大的数字(可能不止一个),输出最后剩余数字个数
- 找出一串数字中,n个连续的数之和最大c++代码实例及运行结果
- 找出一串数字中,n个连续的数之和最大c++代码实例及运行结果
- 找出一串数字中,n个连续的数之和最大c++代码实例及运行结果
- 找出一串数字中,n个连续的数之和最大c++代码实例及运行结果
- 找出一串数字中,n个连续的数之和最大c++代码实例及运行结果
- 找出两个字符串中最大公共子字符串,如"abccade","dgcadde"的最大子串为"cad"
- 数字序列加入+,*运算符后取得最大值问题; 动态规划;打破传统从决策入手思想;找出问题的特有性质;从例子入手找特点
- 编写程序,用户输入10个数字,找出最大的,和最小的
- 程序员面试金典——解题总结: 9.17中等难题 17.4编写一个方法,找出两个数字中最大的那一个。不得使用if-else或其他比较运算符。
- 欧拉计划之题目8:找出这个1000位数字中连续5个数字乘积的最大值
- 字符串中找出连续最长的数字子串,并返回这个数字串的长度
- n个数里面找出最大的m个数字(快排思想)