考察知识点:单调队列

题目分析:

题目中的数组是指一头牛随时间的增加活动范围的变化而形成的数组。然后让求连续的k个小时内,牛的活动的最小范围。即:

这类题目应该使用双端队列做一个单调队列,使得队列尾为最小值,从尾到头值依次增大:

这样维护一个窗口中的最小值。

所用编程语言:C++

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