239.滑动窗口最大值
class Solution {
private:
class queue{
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) {
queue 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;
}
};
时间要求严格,不可以使用暴力算法
使用队列的时间复杂度为O(n)
首先定义队列,定义三个函数:输出上一个,输入下一个,输出最大值
<1>
如果要输出的值等于front,说明是最大值,输出
<2>
如果输入的值大于front,说明此时的数是最大值,把原来第一个pop;
<3>
return 最大值
初始化队列,输入前k个值
定义result存放最大值
347.前K个高频元素
class Solution {
public:
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) { // 如果堆的大小大于了K,则队列弹出,保证堆的大小一直为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;
}
};
先把数组中用map存起来
构建小顶堆,将所有频率将入到堆中,如果堆的大小大于K了,就将元素从堆顶弹出,留下的就是答案