实现单调队列(Hard)
class Solution {
public:
class Myqueue {
public:
deque<int> que;
void pop(int val) {
if (!que.empty() && que.front() == val) {
que.pop_front();
}
}
void push(int val) {
while (!que.empty() && que.back() < val) {
que.pop_back();
}
que.push_back(val);
}
int front() {
return que.front();
}
};
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
Myqueue que;
vector<int> res;
for (int i = 0; i < k; i++) {
que.push(nums[i]);
}
res.push_back(que.front());
for (int i = k; i < nums.size(); i++) {
que.pop(nums[i - k]);
que.push(nums[i]);
res.push_back(que.front());
}
return res;
}
};
优先级队列(小根堆)推荐链接(https://leetcode-cn.com/problems/top-k-frequent-elements/solution/c-xiao-bai-you-hao-you-xian-dui-lie-de-j-53ay/)
class Solution {
public:
class cmp {
public:
bool operator()(const pair<int, int> l, const pair<int, int> r) {
//降序,小根堆
return l.second > r.second;
}
};
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int, int> map;
for (int i = 0; i < nums.size(); i++) {
map[nums[i]]++;
}
priority_queue<pair<int, int>, vector<pair<int, int>>, cmp> pri_que;
for (auto it : map) {
pri_que.push(it);
if (pri_que.size() > k) {
pri_que.pop();
}
}
vector<int> res;
while (!pri_que.empty()) {
res.push_back(pri_que.top().first);
pri_que.pop();
}
return res;
}
};