代码随想录算法训练营第十一天| 239. 滑动窗口最大值 347.前 K 个高频元素
239. 滑动窗口最大值
难点:
1,想好怎么快速找到区块内的最大数值,往常使用的是在遍历一次,但是是O(m*n)
思路:
1,使用单调队列,所有的数值都必须是从大到小,
2,用队列保持必要的顺序,而且对于大于K的循环,每次都要求pop push这两个操作
代码:
1 void pop(deque<int>& slidingWindow, int target) 2 { 3 if (!slidingWindow.empty() && slidingWindow.front() == target) 4 slidingWindow.pop_front(); 5 } 6 7 void push(deque<int>& slidingWindow, int target) 8 { 9 while (!slidingWindow.empty() && slidingWindow.back() < target) 10 { 11 slidingWindow.pop_back(); 12 } 13 14 slidingWindow.push_back(target); 15 } 16 17 vector<int> maxSlidingWindow(vector<int>& nums, int k) 18 { 19 vector<int> result; 20 deque<int> slidingWindow; 21 22 for (int i = 0; i < k; i++) 23 { 24 push(slidingWindow, nums[i]); 25 } 26 result.push_back(slidingWindow.front()); 27 28 for (int i = k; i < nums.size(); i++) 29 { 30 pop(slidingWindow, nums[i-k]); 31 32 push(slidingWindow, nums[i]); 33 34 result.push_back(slidingWindow.front()); 35 } 36 37 return result; 38 }
347.前 K 个高频元素
需要自己再写一遍
代码
1 class myComparsion { 2 public: 3 bool operator()(const pair<int, int>& l, const pair<int, int>& r) 4 { 5 return l.second > r.second; 6 } 7 }; 8 vector<int> topKFrequent(vector<int>& nums, int k) { 9 10 unordered_map<int,int> countMap; 11 for (int num : nums) 12 { 13 countMap[num]++; 14 } 15 vector<int> result(k); 16 //需要背过 17 priority_queue < pair<int, int>, vector<pair<int, int>>, myComparsion> smallQue; 18 19 for (pair<int, int> map_ : countMap) 20 { 21 smallQue.push(map_); 22 if (smallQue.size() > k) 23 { 24 smallQue.pop(); 25 } 26 27 } 28 29 //注意返回的是从小到大,但是需要的是从大到小 30 for (int i = k-1; i>=0; i--) 31 { 32 result[i] = smallQue.top().first; 33 smallQue.pop(); 34 } 35 return result; 36 }