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数组中,即为当前窗口的最小值。