思路:
使用哈希表map和set(去重)维护序列
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n, k, A[N];
map<int, int> mp; // 元素出现的次数
set<int> s; // 维护出现次数为1的元素
int main()
{
cin >> n >> k;
for (int i = 1; i <= n; i++)
cin >> A[i];
// 扫描第一个长度为k的区间:
for (int i = 1; i <= k; i++)
mp[A[i]]++;
for (int i = 1; i <= k; i++)
{
if (mp[A[i]] == 1)
s.insert(A[i]);
}
if (s.empty())
cout << "-1"<<" ";
else
{
cout << *s.rbegin() << " "; // 输出最大值
}
// 扫描后面的区间(每次出去一个元素a,进来一个元素b)
for (int i = k + 1; i <= n; i++)
{
if (mp[A[i - k]] == 1) // 要出去的元素a出现次数为1
{
s.erase(A[i - k]); // 从set中删除a
}
if (mp[A[i - k]] == 2) // 要出去的元素a出现次数为1
{
s.insert(A[i - k]); // a出去后,次数变为1.加入set
}
mp[A[i - k]]--;
if (mp[A[i]] == 0) // b次数为0,加入后=1,所以加入set
{
s.insert(A[i]);
}
if (mp[A[i]] == 1) // b次数为1,加入后=2,所以从set中删除
{
s.erase(A[i]);
}
mp[A[i]]++;
if (s.empty())
cout << "-1 ";
else
cout << *s.rbegin() << " "; // 输出最大值
}
return 0;
}