239. 滑动窗口最大值

自定义双端队列,如果当前插入元素大于队尾元素,则一直弹出,直到队列为空或者比当前元素大

如果当前要弹出元素等于队列头部,则弹出

然后当前元素加入队列

遍历前k个元素,队列左端就是返回数组的第一个元素

然后遍历数组,索引在k开始,每次比较i-k,然后压入第i个

然后将队头加入结果数组

 1 class MyQueue{
 2 private:
 3     deque<int> que;
 4 public:
 5     void push(int i){
 6         while(!que.empty() && que.back() < i)
 7             que.pop_back();
 8         que.push_back(i);
 9     }
10     void pop(int i){
11         if(!que.empty() && que.front() == i)
12             que.pop_front();
13     }
14     int top(){
15         return  que.front();
16     }
17 };
18 
19 class Solution {
20 public:
21     vector<int> maxSlidingWindow(vector<int>& nums, int k) {
22         vector<int> result;
23         MyQueue que;
24         for(int i = 0; i < k; i++){
25             que.push(nums[i]);
26         }
27         result.push_back(que.top());
28         for(int i = k; i < nums.size(); i++){
29             que.pop(nums[i-k]);
30             que.push(nums[i]);
31             result.push_back(que.top());
32         }
33         return result;
34     }
35 };

347. 前 K 个高频元素

大根堆

 1 class Solution {
 2 public:
 3     // 大根堆
 4     class comp{
 5         public:
 6             bool operator()(const pair<int,int>& p1, const pair<int,int>& p2){
 7                 return p2.second > p1.second;
 8             }
 9     };
10     vector<int> topKFrequent(vector<int>& nums, int k) {
11         // 先统计每个数字出现的频率
12         unordered_map<int, int> map;
13         for(int num : nums){
14             map[num]++;
15         }
16 
17         priority_queue<pair<int,int>,vector<pair<int,int>>, comp> pri_queue;
18         for(unordered_map<int, int>::iterator it = map.begin(); it != map.end(); it++){
19             pri_queue.push(*it);
20         }
21         vector<int> result;
22         for(int i = 0; i < k; i++){
23             result.push_back(pri_queue.top().first);
24             pri_queue.pop();
25         }
26         return result;
27     }
28 };