目 录:
1、滑动窗口
- 生成窗口的最大值或者最小值数组,时间复杂度:O(N)。
可阅读:https://www.cnblogs.com/haozhengfei/p/a14049ec0869a8125a69f3af37471c77.html
- 普通解法的时间复杂度为O(N * win),也就是每次对一个窗口遍历其中的 win 个数,选出最大值,最优解可以做到 O(N)。
- 【分析】:准备一个双端队列,双端队列存放着数组中的下标值。假设当前为 arr[i],则放入规则如下:
- left 和 right 指针都只会向右移动,不会回退。
- right 右滑,窗口加数:
- 1)如果 queue 为空,直接把下标 i 放入 queue 中;
- 2)如果 queue 不为空,取出当前 queue 队尾存放的下标 j。如果 arr[j] > arr[i],则直接把 i 放入队尾;
- 3)如果 arr[j] <= arr[i],则一直从 queue 的队尾弹出下标,直到某个下标在 queue 中的对应值大于 arr[i],然后把 i 放入队尾 【为什么可以弹出,因为我永远比你晚过期,我又比你大或者和你一样大,有我在,你永远不可能最大,所以你可以滚了】
- left 右滑,窗口减数:
- right 右滑,窗口加数:

本文介绍了滑动窗口算法的基本概念,并详细阐述了如何使用双端队列高效地求解窗口最大值和最小值的问题。通过分析和步骤解释,展示了如何在O(N)的时间复杂度内求解数组中满足特定条件的子数组数量。
435

被折叠的 条评论
为什么被折叠?



