知识点

单调队列

思路

需要维护一个窗口的最小值,是单调队列的应用场景。单调队列板子题。

时间复杂度

对于每个值只加入队列一次、出队列一次,时间复杂度为线性的,时间复杂度O(n)

AC code(C++)

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @param k int整型 
     * @return int整型vector
     */
    vector<int> minSlidingWindow(vector<int>& nums, int k) {
        // 单调队列
        deque<int> q;
        int n = nums.size();
        vector<int> res;
        for (int i = 0; i < n; i++) {
            while (q.size() && i - q.front() + 1 > k) q.pop_front();
            while (q.size() && nums[q.back()] >= nums[i]) q.pop_back();
            q.push_back(i);
            if (i >= k - 1) res.push_back(nums[q.front()]);
        }
        return res;
    }
};