求序列中连续相邻元素之和最大值的四种算法
2014-08-02 19:07
357 查看
第一种是最直观的算法,把每一种连续相邻的和全都算出来进行比较:
第二种对最内层的循环改进:
第三种采用分治的思想:
第四种算法:
#include <vector> using namespace std; int maxSubSum1(const vector<int>& a) { int maxSum = 0; for (int i = 0; i < a.size(); i++) { for (int j = i; j < a.size(); j++) { int thisSum = 0; for (int k = i; k <= j; k++) { thisSum += a[k]; } if (thisSum > maxSum) { maxSum = thisSum; } } } return maxSum; }
第二种对最内层的循环改进:
#include <vector> using namespace std; int maxSubSum2(const vector<int>& a) { int maxSum = 0; for (int i = 0; i < a.size(); i++) { int thisSum = 0; for (int j = i; j < a.size(); j++) { thisSum += a[j]; if (thisSum > maxSum) { maxSum = thisSum; } } } return maxSum; }
第三种采用分治的思想:
#include <vector> #include <utility> using namespace std; int maxSubRec(const vector<int>& a, int left, int right) { if (left == right) { if (a[left] > 0) { return a[left]; } else { return 0; } } int mid = (left + right) / 2; int maxLeftSubSum = maxSubRec(a, left, mid); int maxRightSubSum = maxSubRec(a, mid + 1, right); int maxLeftBorderSum = 0, leftBorderSum = 0; for (int i = mid; i >= left; i--) { leftBorderSum += a[i]; if (leftBorderSum > maxLeftBorderSum) { maxLeftBorderSum = leftBorderSum; } } int maxRightBorderSum = 0, rightBorderSum = 0; for (int i = mid + 1; i <= right; i++) { rightBorderSum += a[i]; if (rightBorderSum > maxRightBorderSum) { maxRightBorderSum = rightBorderSum; } } return max(maxLeftBorderSum + maxRightBorderSum, max(maxLeftSubSum, maxRightSubSum)); } int maxSubSum3(const vector<int>& a) { return maxSubRec(a, 0, a.size() - 1); }
第四种算法:
int maxSubSum4(const vector<int>& a) { int thisSum = 0, maxSum = 0; for (int i = 0; i < a.size(); i++) { thisSum += a[i]; if (thisSum > maxSum) { maxSum = thisSum; } else if (thisSum < 0) { thisSum = 0; } } return maxSum; }
相关文章推荐
- 数组连续子序列的最大的和;四种算法,四种时间复杂度
- 算法题:找出一个数组中相加值最大的连续序列元素
- 数组连续子序列的最大的和-四种算法,四种时间复杂度
- 给一个数组,元素都是整数(有正数也有负数),寻找连续的元素相加之和为最大的序列。
- HDU1003 Max Sum 最大子序列和的问题【四种算法分析+实现】
- 最大连续和问题【四种不同的算法】
- 【算法】最大子序列的四种算法
- o(n)算法求大连续字段和,并返回最大子段和中的元素
- 输入n个元素组成的序列S,你需要找出一个乘积最大的连续子序列。如果这个最大的乘积不是正数,应输出0(表示无解)。1<=18,-10<=Si<=10
- php 求一个无序数组经过排列后任意两个相邻元素之差的最大值(算法)
- 算法-子数组连续序列最大和其时间复杂度如何从O(n^3)到O(n)
- 连续最大子序列和的几种算法
- 实数序列,求值相邻的两个元素的最大差值
- [LeetCode] House Robber II 求循环数组中元素两两不相邻的子序列最大和
- 求数组的最大连续子序列和的四种算法
- 最大子序列和的四种算法之讲解
- 最大子序列和的四种求解算法及其时间比较
- 寻找连续的元素相加之和为最大的序列
- 算法习题45:对于一个整数矩阵,存在一种运算,对矩阵中任意元素加一时,需要其相邻(上下左右)某一个元素也加一;;;一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
- 求数组相邻元素差值的最大值快速算法(C++版)