The array is [1 3 -1 -3 5 3 6 7], and k is 3.
Window position | Minimum value | Maximum value |
---|---|---|
[1 3 -1] -3 5 3 6 7 | -1 | 3 |
1 [3 -1 -3] 5 3 6 7 | -3 | 3 |
1 3 [-1 -3 5] 3 6 7 | -3 | 5 |
1 3 -1 [-3 5 3] 6 7 | -3 | 5 |
1 3 -1 -3 [5 3 6] 7 | 3 | 6 |
1 3 -1 -3 5 [3 6 7] | 3 | 7 |
Your task is to determine the maximum and minimum values in the sliding window at each position.
8 3 1 3 -1 -3 5 3 6 7Sample Output
-1 -3 -3 -3 3 3 3 3 5 5 6 7
#pragma warning (disable : 4996)
#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
#include <cstdlib>
#include <vector>
#include <map>
#include <queue>
#include <cmath>
#include <stack>
#include <algorithm>
#include <cmath>
using namespace std;
int all[1000002];
int mins[1000002];
int maxs[1000002];
int main()
{
int n, m;
scanf("%d%d", &n, &m);
for (int a = 0; a < n; a++)
scanf("%d", &all[a]);
deque<int>line;//控制長度
int len = 0;
for (int a = 0; a < n; a++)
{
if (line.empty())
line.push_back(a);
else
{
if (all[a] > all[line.back()])
line.push_back(a);//構造遞增隊列, 使得最前的是最小的
else
{
while (!line.empty() && all[a] <= all[line.back()])//數組不要越界
{
line.pop_back();
}
line.push_back(a);
}
}
if (line.front() > a - m + 1 && a >= m - 1)//保證判斷的時候已經到達了所判斷區域的最後
{
mins[len] = all[line.front()];//注意讓每一個判斷區域都有最小值
len++;
}
while (!line.empty() && line.front() <= a - m + 1)//最前元素超出判斷區域將其刪去
{
mins[len] = all[line.front()];
len++;
line.pop_front();
}
}
// while (len < n - -m)
// {
// mins[len] = all[line.front()];
// len++;
// }
//
while (!line.empty())
line.pop_back();
len = 0;
for (int a = 0; a < n; a++)
{
if (line.empty())
line.push_back(a);
else
{
if (all[a] < all[line.back()])
line.push_back(a);
else
{
while (!line.empty() && all[a] >= all[line.back()])
{
line.pop_back();
}
line.push_back(a);
}
}
if (line.front() > a - m + 1 && a >= m - 1)
{
maxs[len] = all[line.front()];
len++;
}
while (!line.empty() && line.front() <= a - m + 1)
{
maxs[len] = all[line.front()];
len++;
line.pop_front();
}
}
//
for (int a = 0; a < len; a++)
{
printf("%d", mins[a]);
if (a != len - 1)
printf(" ");
else
printf("\n");
}
for (int a = 0; a < len; a++)
{
printf("%d", maxs[a]);
if (a != len - 1)
printf(" ");
else
printf("\n");
}
return 0;
}