题解 | #滑动窗口的最大值# 哈希表+优先队列
滑动窗口的最大值
https://www.nowcoder.com/practice/1624bc35a45c42c0bc17d17fa0cba788
#include <functional>
#include <queue>
#include <vector>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param num int整型vector
* @param size int整型
* @return int整型vector
*/
vector<int> maxInWindows(vector<int>& num, int size) {
// write code here
vector<int> res;
int n = num.size();
// 特殊情况的处理
if (size > n) return res;
else if (size == 0) return res;
// 构建一个返回最大值的优先队列
priority_queue<int, vector<int>, less<int>> que;
for (int i = 0; i < size; i++) {
que.push(num[i]);
}
// 统计第一个结果
res.push_back(que.top());
// 创建一个哈希表来整理可能去除的元素
map<int, int> mp;
int tmp = size;
while (tmp < n) {
// 随着滑动窗口的更新,更新哈希表和优先队列
if(mp.find(num[tmp-size]) == mp.end()){
mp.insert(make_pair(num[tmp-size],1));
}else{
mp[num[tmp-size]] = mp[num[tmp-size]] + 1;
}
// for (const auto& [key, value] : mp) {
// std::cout << "Key: " << key << ", Value: " << value;
// }
cout<< endl;
que.push(num[tmp]);
// 检查最大值是不是落在了已经需要被排除的部分,该过程需要反复检查,直到哈希表中没有相关元素
while (mp.find(que.top()) != mp.end() && mp[que.top()] > 0) {
// 如果mp中找到了现在队列的最大值,则需要更新队列和mp的内容实现去除这些元素的逻辑
// 注意这里一定要先进行mp的操作,都则que.pop()之后其top()结果将发生改变。
mp[que.top()]--;
que.pop();
}
res.push_back(que.top());
tmp++;
}
return res;
}
};
查看9道真题和解析