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ㄒ)/~~

不过姐会进步的!~~等着我一天吃透十道题~~~😄蛤蛤蛤

posted @ 2024-03-27 19:20  翻斗花园小美Q  阅读(4)  评论(0编辑  收藏  举报