239.滑动窗口最大值
好家伙,是一道困难题,这是算法训练营开始以来遇到的第一道困哪题,但是还好是滑动窗口,并不是特别的难。
思路
思路的话就是运用滑动窗口,来维护单调队列,我将滑动窗口分为四步。
- 当前元素与队尾比较,如果比队尾大,队尾就不断出队
- 将该点入队
- 防止入队之后,超出滑动窗口的大小,然后判断一下,决定是否将队头出队
- 如果i-k+1>=0,那么此时的队头就是我们需要的结果之一了。
代码实现
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
deque<int>dq;
vector<int>res;
for(int i = 0 ; i < nums.size(); i ++)
{
while(!dq.empty()&&nums[i]>nums[dq.back()])
dq.pop_back();
dq.push_back(i);
if(i-k+1>dq.front())
dq.pop_front();
if(i>=k-1)
res.push_back(nums[dq.front()]);
}
return res;
}
};
收获
如果要进行频繁的队头队尾的入队出队操作,那么就可以使用deque。
347.前 K 个高频元素
思路
先使用unordered_map存储,nums[i]作为key值,然后统计value;
然后使用优先队列构建大顶堆;
最后输入前k个就可以了。
代码实现
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
priority_queue<pair<int,int>>dq;
unordered_map<int,int>map;
vector<int>res;
for(auto i : nums)
map[i]++;
for(auto i : map)
dq.emplace(i.second,i.first);
while(k--)
{
res.push_back(dq.top().second);
dq.pop();
}
return res;
}
};
收获
刚刚知道了竟然有priority_queue这么好用的东西,不错。
还有就是dq.emplace,如果有多个元素的话,先比较的是第一个元素,比如上面的代码,比较
i.second。