● 239. 滑动窗口最大值
● 347.前 K 个高频元素
239. 滑动窗口的最大值
利用单调队列解题,
维护单调递减的队列(因为求最大值)
队列头部是当前最大值
第一次接触,看了下思路,感觉还可以
class Solution {
class Qeque
{
deque<int> dq;
public:
Qeque() {
}
// 先从队列尾部判断数值的大小,把小于 num 的全部弹出
void push(int num) {
while(!dq.empty() && dq.back() < num) {
dq.pop_back();
}
dq.push_back(num);
}
// 在滑动窗口改变时才 pop
// 所以要判断,该数组元素是不是当前窗口最大值,是才 pop
void pop(int num) {
if(!dq.empty() && num == dq.front()) {
dq.pop_front();
}
}
int front() {
return dq.front();
}
};
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
vector<int> res;
Qeque q;
for(int i = 0; i < k; ++i) {
q.push(nums[i]);
}
res.push_back( q.front() );
for(int i = k; i < nums.size(); ++i) {
q.pop(nums[i - k]);
q.push(nums[i]);
res.push_back( q.front() );
}
return res;
}
};
347. 前 K 个高频元素
所以为什么不用大顶堆呢...
class Solution {
struct cmp {
bool operator() (const pair<int, int>& lhs, const pair<int, int>& rhs) const {
return lhs.second < rhs.second;
}
};
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
vector<int> res;
unordered_map<int, int> hash;
for(auto& i : nums) {
hash[i]++;
}
priority_queue<pair<int, int>, vector<pair<int, int>>, cmp> pq;
for(auto it = hash.begin(); it != hash.end(); ++it) {
pair<int, int> p { it->first, it->second };
pq.push(p);
}
while(k--) {
pair<int, int> p = pq.top();
pq.pop();
res.push_back(p.first);
}
return res;
}
};