滑动窗口:核心思想
核心思想:维护一个窗口(又叫做子区间),通过调整窗口的起始位置(start
)和终止位置(end
),来寻找符合特定条件的子区间。
- 滑动窗口算法常常和双指针相结合使用
- 常常用于处理数组或字符串中的子区间问题
- 优势在于它能够在线性时间复杂度 O ( N ) O(N) O(N)内解决一些需要求解子区间的问题,而无需使用暴力遍历的方式
滑动窗口问题解决步骤:
- 初始化窗口的左指针(
left
)和右指针(right
)- 通常为数组或字符串的起始位置, 令
left, right = 0, 0
- 通常为数组或字符串的起始位置, 令
- 移动窗口的右指针(
right
),扩大窗口,直到满足某个条件为止- 一般当右指针到达数组或字符串右边界时,停止扩大窗口
- 当窗口满足条件时,如果需要找到最小长度或最大长度,可以更新结果。
- 移动窗口的左指针(
left
),缩小窗口,直到不再满足条件为止。 - 重复步骤 2 和 4,直到遍历完整个数组或字符串。
Leetcode:长度最小的子数组
题目描述
给定一个含有 n
个正整数的数组和一个正整数target
。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组[numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。如果不存在符合条件的子数组,返回0
。
示例 1:
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
示例 2:
输入:target = 4, nums = [1,4,4]
输出:1
示例 3:
输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0
题目链接:https://leetcode.cn/leetbook/read/all-about-array/x9gogt/
题目分析与实现
数据结构:数组
实现方法:
-
暴力破解法
-
滑动窗口
-
前缀和 + 二分查找
1 # Use Python to solve
2 def minSubArrayLen(target, nums):
3 """
4 使用滑动窗口算法解决:找到数组中和大于等于给定目标数的最短连续子数组的长度问题
5
6 参数:
7 target(int):目标值
8 nums(List[int]): 目标数组
9
10 返回值:
11 int
12 """
13 n = len (nums)
14 # 初始化左右指针
15 left = 0
16 right = 0
17 # 初始化最小长度
18 min_len = n + 1
19
20 cal_sum = 0
21
22 # 将 right 指针向右移动,并累计子数组的和 cal_sum。
23 while right < n:
24 cal_sum += nums[right]
25 # 调整子数组的范围
26 while cal_sum >= target:
27 min_len = min (min_len, right - left + 1)
28 cal_sum -= nums[left]
29 left += 1
30 right += 1
31 # 如果最后最小长度没变,说明该数组当中不存在满足目标值的最小子区间,直接返回0
32 if min_len == n + 1:
33 return 0
34 else:
35 return min_len
最后,推荐一个在线调试的网站,可以直接在网页查看程序每一步骤的调用结果,对于理解程序是如何运行比较有帮助:
- pythontutor.com