力扣题解(队列)

2020-03-04  本文已影响0人  衣介书生

933. 最近的请求次数

构建一个请求队列,之前的请求与当前请求时间间隔大于 3000 ms 的出队列,最后返回队列的长度即可。

class RecentCounter {
private: 
    queue<int> q;

public:
    RecentCounter() {
    
    }
    
    int ping(int t) {
        q.push(t);
        while(!q.empty() && q.front() < t - 3000) {
            q.pop();
        }
        return q.size();
    }
};

/**
 * Your RecentCounter object will be instantiated and called as such:
 * RecentCounter* obj = new RecentCounter();
 * int param_1 = obj->ping(t);
 */

面试题59 - I. 滑动窗口的最大值

双向队列

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        int n = nums.size();
        deque<int> dq;
        vector<int> res;
        if(n < k)
            return res;
        // 每一轮要做的事情:
            // 1 检查最左侧的元素是否需要退场
            // 2 把最大的数对应的下标放在双向队列的最左端,如果左边下标的元素小于当前元素,则清除左边下标的元素
            // 3 输出双向队列最左端下标对应的元素
        for(int i = 0; i < n; ++i) {
            // 检查最左侧的元素是否需要退场
            while(!dq.empty() && i - dq.front() +1 > k)
                dq.pop_front();
            // 把最大的数对应的下标放在双向队列的最左端,如果左边下标的元素小于当前元素,则清除左边下标的元素
            while(!dq.empty() && nums[dq.back()] <= nums[i])
                dq.pop_back();
            dq.push_back(i);
            // 输出双向队列最左端下标对应的元素
            if (i >= k - 1)
                res.push_back(nums[dq.front()]);
        }
        return res;       
    }
};

347. 前 K 个高频元素

优先队列

class Solution {
public:
    vector<int> topKFrequent(vector<int>& nums, int k) {
        vector<int> res;
        unordered_map<int, int> mp;
        // 默认大顶堆
        priority_queue<pair<int, int> > pq;
        for (auto num: nums)
            mp[num] ++;
        for (auto p: mp) {
            pq.push (pair<int, int>(-p.second, p.first));
            if (pq.size() > k)
                pq.pop();
        }
        while(k--) {
            res.push_back(pq.top().second);
            pq.pop();
        }
        return res;
    }
};
上一篇下一篇

猜你喜欢

热点阅读