239. 滑动窗口最大值[hard]
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
deque<int> que;
vector<int> res;
for(int i=0; i<k; i++)//先放入前k个元素
{
while(!que.empty()&&nums[i]>que.back())//比待插入元素小的就弹出,维持队列单调减
{
que.pop_back();
}
que.push_back(nums[i]);
}
res.push_back(que.front());//存入队列头部元素
for(int i=k; i<nums.size(); i++)//滑动窗口
{
if(!que.empty()&&que.front()==nums[i-k]) que.pop_front();//如果头部元素是窗口外的元素直接弹出,否则保留
while(!que.empty()&&nums[i]>que.back())//尾部元素比待插入元素小就弹出,维护队列单调减
{
que.pop_back();
}
que.push_back(nums[i]);
res.push_back(que.front());//保存当前窗口的头部元素
}
return res;
}
};
347.前 K 个高频元素
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int, int> map; // map<nums[i],对应出现的次数
for (int i = 0; i < nums.size(); i++) {
map[nums[i]]++;
}
vector<pair<int, int>> vec(map.begin(), map.end());//将map中的元素存入vector中
sort(vec.begin(),vec.end(), [&](const auto& a, const auto& b) {return a.second > b. second;});//vec按出现的频率大小排序
vector<int> res;
for(int i=0; i<k; i++) res.push_back ( vec[i].first);//将前k大的元素存入res
return res;
}
};
总结
239. 滑动窗口最大值: 用一个双端队列来维护一个单调递减队列。每次放回队列头部的元素。
347.前 K 个高频元素: 用一个map保存所有元素及其出现的频率。如何放入vertor中。将vector用sort()方法按出现频率的大小排序。放回vector前k个元素。