239.滑动窗口最大值
创建一个双端队列 deque
来存储滑动窗口中的元素的索引。
for (int i = 0; i < k; ++i) {
//也可以用if进行替换 while (!deque.isEmpty() && nums[i] >= nums[deque.peekLast()]) { deque.pollLast(); } deque.offerLast(i); }
在这个循环中,我们处理滑动窗口的初始阶段(前 k
个元素)。我们遍历索引 i
从 0 到 k-1
,并执行以下操作:
- 首先,我们通过移除队列中比当前元素小的元素,确保队列中的元素按照从大到小的顺序排列。我们从队尾开始比较,如果当前元素大于等于队尾元素,就将队尾元素移除。
- 接着,我们将当前元素的索引
i
加入队尾。
这样,队列的头部元素就是当前滑动窗口中的最大值的索引。
滑动窗口的最大值共有 n - k + 1
个,因为每次滑动窗口移动一次,就会产生一个新的最大值。
所以初始化为:
int[] ans = new int[n - k + 1];
先插入一条(可以稍后来看):为什么是 i - k
来确定滑动窗口的左边界?
k是滑动窗口的大小,i是滑动窗口最右的边界,i-k+1是此时滑动窗口的左边界(可以画个图来帮助理解),所以用i-k当作左边界的判断条件
当索引值 > i-k 的时候才在滑动窗口里(自己画图理解)
- 当
i
大于等于k
时,表示当前窗口的大小已经达到了k
。 i - k
的值就是当前窗口的左边界,即窗口中的第一个元素的索引。
aaaaaaaaa!!!!!!!!!!姐通过了!!!不过就是一天吃透一道题/(ㄒoㄒ)/~~
不过姐会进步的!~~等着我一天吃透十道题~~~😄蛤蛤蛤