这个子序列,我们可以想象,它既然是最大的,表明这个子和的第一个元素()和最后一个元素,肯定不能是一个负数。
算法描述:T(N) = O(N)
1.设置两个变量maxSum用于保存最大子和,maxSum初始值为A[0],currentSum用于保存当前子和,初始值为0。
2.遍历数组,currentSum和当前元素相加,然后和maxSum比较,如果大于maxSum,那么maxSum = currentSum;
currentSum小于0,那么currentSum = 0,然后继续后面的循环。
3.遍历结束,maxSum即为最大子和
代码如下:
#include <stdio.h>
#include <iostream>
#include <vector>
using namespace std;
// 创建一个数组
bool createArray(vector<int>& dataArray);
// 求最大子和序列
bool getMaxSumFromArray(const vector<int>& dataArray,int& maxSum);
int main()
{
vector<int> nums;
if (!createArray(nums))
return -1;
int maxSum;
if (getMaxSumFromArray(nums,maxSum))
{
cout << "最大子和序列为: " << maxSum << endl;
}
getchar();
return 0;
}
// 创建一个数组
bool createArray(vector<int>& dataArray)
{
int nSize;
cout << "请输入数组长度:";
cin >> nSize;
cout << endl;
if (nSize <= 0)
return false;
for (int i = 0; i < nSize; i++) {
int x;
cin >> x;
dataArray.push_back(x);
}
// 输出一遍数组
for (int j = 0; j < nSize; j++) {
cout << dataArray[j] << " ";
}
cout << endl;
return true;
}
// 求最大子和序列
bool getMaxSumFromArray(const vector<int>& dataArray, int& maxSum)
{
if (dataArray.empty())
return false;
int currentSum = 0;
int len = dataArray.size();
for (int i = 0; i < len; i++) {
if (i == 0) {
maxSum = dataArray[0];
}
currentSum += dataArray[i];
if (currentSum > maxSum) {
maxSum = currentSum;
}
if (currentSum < 0)
{
currentSum = 0;
}
}
return true;
}