import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param nums int整型一维数组
     * @param k int整型
     * @return int整型一维数组
     */
    public int[] minSlidingWindow (int[] nums, int k) {
        int n = nums.length;
        int[] minRanges = new int[n - k + 1];
        Deque<Integer> deque = new ArrayDeque<>();

        for (int i = 0; i < n; i++) {
            while (!deque.isEmpty() && deque.peekFirst() < i - k + 1) {
                deque.pollFirst();
            }

            while (!deque.isEmpty() &&
                    nums[deque.peekLast()] > nums[i]) {
                deque.pollLast();
            }

            deque.offerLast(i);

            if (i >= k - 1) {
                minRanges[i - k + 1] = nums[deque.peekFirst()];
            }
        }

        return minRanges;
    }
}

本题知识点分析:

1.栈的出栈和入栈

2.数组遍历

3.数学模拟

本题解题思路分析:

1.在每一轮循环中,先判断deque的头部是否在当前窗口内,如果不在,则将头部元素出队。

2.然后判断deque的尾部元素是否大于当前元素,如果大于,则将尾部元素出队。这是因为在deque中只需要保留比当前元素大的元素,因为它们不可能是窗口中的最小值。

3.将当前元素的索引放入deque的尾部,表示当前元素已经入队。

4.如果当前元素的索引大于等于窗口的大小k-1,则表示窗口已经满了,此时将deque头部元素对应的nums值存入minRanges数组中,即为当前窗口的最小值。

本题使用编程语言: Java