239.滑动窗口最大值
此刻,有一个小女孩轻轻地碎了.......这道题用双向队列来解,还是自定义的双向队列,太妙了吧,但是也好绕.......用双向队列来解,需要重新定义入队队列和出队队列,入队的时候我们要把这个队列里面小于当前元素的值的所有元素都清除掉,因为这样可以保证队首永远是最大的元素,队首的下一个是次级大的元素,下一个是次次级大的元素,这样如果队首没了,下一个依旧是队列里面的最大元素,出队的时候也就是pop()队首元素的时候,不过我们这时候得看要删除到哪个元素了,因为队列里面的顺序并不是给定的数组里面的顺序了,队列里会少了一些被清除掉的元素,所以得当要删除到的元素是队首元素的时候,我们才把队首元素给删除掉。至于在外部要获取这个队列的最前面的元素,由于是外部创造对象来调用这个自定义双向队列的函数,所以这时候也得提供接口获得队列的队首元素。
https://leetcode.cn/problems/sliding-window-maximum/submissions/513401793/
class Solution {
private:
class MyQueue
{
public:deque<int>dq;
void pop(int value)
{
if(value==dq.front())
{
dq.pop_front();
}
}
void push(int value)
{
while(!dq.empty()&&value>dq.back())
{
dq.pop_back();
}
dq.push_back(value);
}
int getMaxValue()
{
return dq.front();
}
};
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
MyQueue que;
vector<int>result;
for(int i=0;i<k;i++)
{
que.push(nums[i]);
}
result.push_back(que.getMaxValue());
for(int i=k;i<nums.size();i++)
{
que.pop(nums[i-k]);
que.push(nums[i]);
result.push_back(que.getMaxValue());
}
return result;
}
};
347.前K个高频元素
小女孩又碎了一次,这道题的思路还挺简单的,就用一个map来记录元素以及它出现的频次,然后我们再用小根堆来排一下序,但是我不熟悉priority_queuey已经map的用法,写起来磕磕绊绊的...o(╥﹏╥)o
https://leetcode.cn/problems/top-k-frequent-elements/submissions/513465684/
class Solution {
public:
class mycomparison
{
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>fre;
for(int i=0;i<nums.size();i++)
{
fre[nums[i]]++;
}
priority_queue<pair<int, int>, vector<pair<int,int>>,mycomparison> que;
for(unordered_map<int,int>::iterator it = fre.begin();it!=fre.end();it++)
{
que.push(*it);
if(que.size()>k)
{
que.pop();
}
}
vector<int>result(k);
for(int i=k-1;i>=0;i--)
{
result[i]=que.top().first;
que.pop();
}
return result;
}
};