自定义双端队列,如果当前插入元素大于队尾元素,则一直弹出,直到队列为空或者比当前元素大
如果当前要弹出元素等于队列头部,则弹出
然后当前元素加入队列
遍历前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 };
大根堆
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 };
浙公网安备 33010602011771号