Day13 239.滑动窗口最大值 347.前k个高频元素
239.滑动窗口最大值
class Solution {
public:
//三个方法传递queue的引用
void pop(int val, deque<int>& que)
{
if(!que.empty()&&que.front()==val) que.pop_front();
}
void push(int val,deque<int>& que)
{
while(!que.empty()&&que.back()<val)
{
que.pop_back();
}
que.push_back(val);
}
int getMaxValue(deque<int>& que)
{
return que.front();
}
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
vector<int> Result; //记录结果的数组
deque<int> que; //初始化队列,Index从0到k-1
for(int i=0; i<k;i++)
{
push(nums[i],que);
}
//Result先放个初始状态的元素
Result.push_back(getMaxValue(que));
for(int i =k;i<nums.size();i++)
{
push(nums[i],que);
pop(nums[i-k],que);
Result.push_back(getMaxValue(que));
}
return Result;
}
};
347.前k个高频元素
priority_queue只提供了以下几个成员函数用于访问和修改堆顶元素:
top()
:返回最大(或最小)元素的引用,但并不从队列中移除该元素。push(const T& value)
:将一个元素加入队列中,并按优先级进行调整。pop()
:移除队列中的最大(或最小)元素。
需要注意的是,默认情况下,std::priority_queue
是按照元素的比较运算符 <
进行堆排序的,所以堆顶元素默认是最大的元素。
class Solution {
public:
//自定义priority_queue排序规则
class myComparison{
public:
bool operator()(const pair<int,int>& lhs, const pair<int,int>& rhs){
return lhs.second > rhs.second;
}
};
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>>,myComparison> 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();
}
//遍历pri_que的first值
vector<int> result(k);
for(int i=0;i<k;i++)
{
result[i] = pri_que.top().first;
pri_que.pop();
}
return result;
}
};