算法记录Day 13 | 栈与队列part03

39 阅读1分钟

算法记录Day 13 | 栈与队列part03

LeetCode 239. 滑动窗口最大值

题目链接:leetcode.cn/problems/sl…

题解
class Solution {
   public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        vector<int> res;
        vector<int> win;
        for (int i = 0; i < nums.size(); i++) {
            // 弹出多余的元素
            if (i >= k && i - k >= win.front()) {
                win.erase(win.begin());
            }

            // 维持队列的单调递减
            while (!win.empty() && nums[win.back()] <= nums[i]) {
                win.pop_back();
            }

            // 元素加入结果集
            win.push_back(i);
            if (i >= k - 1) {
                res.push_back(nums[win.front()]);
            }
        }
        return res;
    }
};

LeetCode 347.前 K 个高频元素

题目链接:leetcode.cn/problems/to…

题解
class Solution {
   public:
    vector<int> topKFrequent(vector<int>& nums, int k) {
        unordered_map<int, int> map;
        // 重载运算符号
        struct comparison {
            bool operator()(pair<int, int>& p1, pair<int, int>& p2) {
                return p1.second > p2.second;
            }
        };
        priority_queue<pair<int, int>, vector<pair<int, int>>, comparison> q;
        for (int i = 0; i < nums.size(); i++) {
            map[nums[i]] += 1;
        }
        for (auto& e : map) {
            q.push(e);
            if (q.size() > k) {
                q.pop();
            }
        }
        vector<int> res;
        while (!q.empty()) {
            res.push_back(q.top().first);
            q.pop();
        }
        return res;
    }
};