经点算法题目:给定数组,获取数组中n个连续元素,最大的和

应用BF算法与滑动窗口,求数组n个连续元素的和,C++编码;

// 给定数组,获取数组中n个连续元素,最大的和
// Input: [-3, 3, 1, -3, 2, 4, 7], n=3
// Output: 13

#ifndef SLIDINGWINDOW_H_H
#define SLIDINGWINDOW_H_H

// 给定数组,获取数组中n个连续元素,最大的和
// Input: [-3, 3, 1, -3, 2, 4, 7], n=3
// Output: 13

#include 
#include 
using namespace std;

int SlidingSum(const vector<int> &vecTarget, const int &nNum)
{
	int nMaxSum = 0;
	int nTempSum = 0;
	
	// 如果输入的K值大于数组的长度,全部相加 
	if (nNum >= vecTarget.size())
	{
		for (int i = 0; i < vecTarget.size(); i++)
		{
			nMaxSum+=vecTarget[i];
		}
		return nMaxSum;
	}

	// 暴力破解算法 时间复杂的O(n*m)
	for (int i = 0; i < vecTarget.size()-nNum+1; i++)
	{
		for (int j = i; j < nNum+i; j++)
		{
			nTempSum+=vecTarget[j];
		}
		nMaxSum = max(nMaxSum,nTempSum);
		nTempSum = 0;
	}


	// 应用滑动窗口,先计算数组前K个值 时间复杂度O(n)
	for (int nCur = 0; nCur < nNum; nCur++)
	{
		nMaxSum+=vecTarget[nCur];
		nTempSum = nMaxSum;
	}
	for (int nCur = nNum; nCur < vecTarget.size(); nCur++)
	{
		nTempSum+=vecTarget[nCur]-vecTarget[nCur-nNum];
		nMaxSum = max(nTempSum, nMaxSum);
	}

	return nMaxSum;
}

int main(void)
{
	vector<int> m_vecTarget;
	int m_nTempNum=0;
	int k=0;

	cout << "请输入数组(空格间隔,回车结束输入):";
	while (cin >> m_nTempNum)
	{
		m_vecTarget.push_back(m_nTempNum);

		if ( '\n' == cin.get())
		{
			break;
		}

	}

	cout << "请输入需要截取的K值:";
	cin >> k;

	cout << "截取K个长度数组的相加的最大值:" << SlidingSum(m_vecTarget, k) << endl;

	system("pause");
	return 0;
}

#endif //SLIDINGWINDOW_H_H

打铁的小透明一个,有问题请大佬指出,感激;

你可能感兴趣的:(经点算法题目:给定数组,获取数组中n个连续元素,最大的和)