📚相关专栏:寻找one piece的刷题之路
什么是滑动窗口
滑动窗口算法是一种常用的算法模式,通常用于字符串匹配、数组操作等问题中,特别是需要在一段连续的数据中寻找满足特定条件的子序列问题。它通过维护一个窗口(一段连续的子数组或子串),并在数据结构上滑动(移动)这个窗口,来寻找最优解或者满足特定条件的子序列。
滑动窗口算法的基本步骤
- 初始化窗口:选择一个起始点,并确定窗口的初始大小。
- 扩展窗口:从起始点开始,向右扩展窗口,直到找到一个满足特定条件的子序列。
- 收缩窗口:如果当前窗口的子序列仍然满足条件,尝试从左侧收缩窗口,直到不满足条件为止。
- 更新结果:在每次扩展和收缩窗口之后,检查当前窗口是否是最优解,并更新结果。
- 重复步骤:重复上述步骤,直到遍历完整个输入数据。
滑动窗口算法的优点
- 效率高:相比暴力解法,滑动窗口算法可以在O(n)的时间复杂度内解决问题,其中n是输入数据的长度。
- 易于实现:算法逻辑简单,易于理解和实现。
- 适用性广:可以应用于多种不同类型的问题。
一、⻓度最⼩的⼦数组
题目描述:
题目分析:
因为这题计算的是某一段区间的元素总和,是连续的,就可以尝试用滑动窗口来解决。每次固定好左指针l,然后让右指针r 不断向右遍历数组,并记录累加和sum,直到第一次区间【l,r】的sum>target时,我们就找到了以 l 为起始点的最大窗口,接着就没必要再继续向右扩展窗口了。此时就可以尝试舍去l,让l向右移动,缩小窗口,由于我们已经知道区间【l,r】的元素和了,就没必要再遍历计算一遍了。将sum减去之前 l 所指的元素值,就能得到区间【l+1,r】的元素和了。以此类推,我们只要不断维护好这个区间就能得出最终结果了
滑动流程:
1、初始化窗口:定义两个指针 l 和 r ,一开始都让他们指向0位置
2、扩展窗口:让 r 指向的元素“进入窗口”
3、收缩窗口:判断此时窗口内元素和与target大小关系
- 如果大于等于:更新结果,将左端元素划出去的同时继续判断是否满⾜条件并更新结果(因为左端元素可能很⼩,划出去之后依旧满⾜条件)
-
如果小于:说明窗口太小, right++ ,另下⼀个元素进⼊窗⼝
4、重复步骤:重复上述步骤2与3,直到 指针r 遍历完整个输入数据
代码实现:
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int n=nums.length,min=