// MaxInSlidingWindow.cpp : 定义控制台应用程序的入口点。
//
//滑动窗口的最大值
//对于输入数组{2,3,4,2,6,2,5,1}及滑动窗口大小为3时
//它们的最大值分别为{4,4,6,6,6,5,}
//数组长度为n,滑动窗口大小为k时
//暴力解法:O(nk)
//利用队列记录当前在滑动窗口内可能成为最大值的元素的位置
//用向量记录当前滑动窗口内的最大值,在队头
//算法复杂度:O(n)
#include<iostream>
#include<vector>
#include<deque>
#include<time.h>
using namespace std;
class Solution
{
public:
void MaxSlidingNumber(vector<int>& number, vector<int>& result,int size)
{
result.clear();
if (number.size() == 0||size==0||number.size()<size)
return;
deque<int> index; //记录可能成为最大值的位置
int i;
for ( i = 0; i < size; i++) //前size个
{
while (!index.empty() &&number[index.back()] <= (number[i]))
{
index.pop_back(); //弹出不可能成为最大值的位置
}
index.push_back(i);
}
while (i < number.size())
{
result.push_back(number[index.front()]);
while (!index.empty() && (number[index.back()] <= (number[i])))
index.pop_back();
if (!index.empty()&&index.front() <= (i - size)) //原始最大值可能在已在滑动窗口之外
index.pop_front();
index.push_back(i);
i++;
}
}
};
void disp(vector<int>& v)
{
for (int i = 0; i < v.size(); i++)
cout << v[i] << " ";
cout << endl;
}
int main()
{
vector<vector<int> > test_data(10, vector<int>(10, 0));
vector<int> result;
Solution S;
for (int i = 0; i < 10; i++)
{
srand(i);
for (int j = 0; j < 10; j++)
{
test_data[i][j] = rand() % 20;
}
cout << "原始序列:" << endl;
disp(test_data[i]);
S.MaxSlidingNumber(test_data[i], result, 3);
cout << "最大值序列:" << endl;
disp(result);
}
return 0;
}
滑动窗口最大值
最新推荐文章于 2023-05-11 10:45:00 发布