239. 滑动窗口最大值
这道题是一道队列的应用,主要切入的点为队首的元素必须为当前窗口的最大值,因此需要维护一个不递增的双端队列,然后维护其在窗口划出范围外时删除对应的最大值,详细代码如下:
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
//双端队列 保证不递增
deque<int> deq;
vector<int> res;
//if(k<nums.size()) return {};
for(int i=0;i<k;i++)
{
if(deq.empty()||deq.back()>=nums[i]) deq.push_back(nums[i]);
else{
while(!deq.empty()&&deq.back()<nums[i])
deq.pop_back();
deq.push_back(nums[i]);
}
}
res.push_back(deq.front());
for(int i=k;i<nums.size();i++)
{
//pop窗口最前面移出范围外的元素
if(!deq.empty()&&nums[i-k]==deq.front()) deq.pop_front();
while(!deq.empty()&&deq.back()<nums[i]) deq.pop_back();
deq.push_back(nums[i]);
res.push_back(deq.front());
}
return res;
}
};
347.前 K 个高频元素
这道题具体思路不太明晰,学习代码随想录并总结思想:
注意需要自定义优先队列的排序规则,此时需要用到仿函数,即一个类似函数的类,类中重载了运算符(),如本题目中的仿函数为:
class myCompare
{
public:
bool operator()(pair<int,int>&l,pair<int,int>&r)
{
//小顶堆
return l.second>r.second;
}
};
详细代码如下:
class Solution {
public:
class myCompare
{
public:
bool operator()(pair<int,int>&l,pair<int,int>&r)
{
//小顶堆
return l.second>r.second;
}
};
vector<int> topKFrequent(vector<int>& nums, int k) {
priority_queue<pair<int,int>,vector<pair<int,int>>,myCompare> que;
unordered_map<int,int> map;
vector<int> res;
//构建哈希表
for(int i=0;i<nums.size();i++)
{
map[nums[i]]++;
}
//排序
for(unordered_map<int,int>::iterator it = map.begin();it!=map.end();it++)
{
que.push(*it);
if(que.size()>k) que.pop();
}
//取元素
for(int i=k-1;i>=0;i--)
{
res.push_back(que.top().first);
que.pop();
}
return res;
}
};
总结
栈与队列做一个总结吧,加油