应用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 <iostream>
#include <vector>
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
打铁的小透明一个,有问题请大佬指出,感激;