您的位置:首页 > 其它

求序列中连续相邻元素之和最大值的四种算法

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐