239. 滑动窗口最大值
文章讲解:代码随想录
视频讲解:单调队列正式登场!| LeetCode:239. 滑动窗口最大值_哔哩哔哩_bilibili
题目链接:. - 力扣(LeetCode)
解题思路:
1.设计单调队列。push得逻辑是每次新加入的值跟队列元素一一比较,先while判断,将小于新加入值得元素全部pop,结束while,然后push这个新值。pop得逻辑是每次将滑动窗口需要移除得元素和队列pop得值比较,如果相等则pop,不相等说明在push元素得时候因为小于新加入得值已经被pop出去了。front逻辑则是返回队列最前得元素。
关键点:
1.设计单调队列的数据结构,即MyQueue类
c++代码:
class Solution
{
private:
class MyQueue
{
public:
deque<int> que;
void pop(int value)
{
if(!que.empty() && value == que.front())
{
que.pop_front();
}
}
void push(int value)
{
while(!que.empty() && value > que.back())
{
que.pop_back();
}
que.push_back(value);
}
int front()
{
return que.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.front());
for(int i=k;i<nums.size();i++)
{
que.pop(nums[i-k]);
que.push(nums[i]);
result.push_back(que.front());
}
return result;
}
};
347.前 K 个高频元素
文章讲解:代码随想录
视频讲解:优先级队列正式登场!大顶堆、小顶堆该怎么用?| LeetCode:347.前 K 个高频元素_哔哩哔哩_bilibili
题目链接:. - 力扣(LeetCode)
解题思路:
1.太难还没看懂
关键点:
1.没看懂
c++代码:
class Solution
{
class mycompariosn
{
public:
bool operator()(const pair<int,int>& lhs,const pair<int,int>& rhs)
{
return lhs.second > rhs.second;
}
};
public:
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>>,mycompariosn> pri_que;
for(unordered_map<int,int>::iterator it = map.begin();it != map.end();it++)
{
pri_que.push(*it);
if(pri_que.size() > k)
{
pri_que.pop();
}
}
vector<int> result(k);
for(int i=k-1;i>=0;i--)
{
result[i] = pri_que.top().first;
pri_que.pop();
}
return result;
}
};