C++ 最大子和序列2

这个子序列,我们可以想象,它既然是最大的,表明这个子和的第一个元素()和最后一个元素,肯定不能是一个负数。

算法描述: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;
}
发布了257 篇原创文章 · 获赞 22 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/qq_24127015/article/details/104389871