算法 | 滑动窗口算法笔记

滑动窗口:核心思想

核心思想:维护一个窗口(又叫做子区间),通过调整窗口的起始位置(start)和终止位置(end),来寻找符合特定条件的子区间。

  • 滑动窗口算法常常和双指针相结合使用
  • 常常用于处理数组或字符串中的子区间问题
  • 优势在于它能够在线性时间复杂度 O ( N ) O(N) O(N)内解决一些需要求解子区间的问题,而无需使用暴力遍历的方式

滑动窗口问题解决步骤:

  1. 初始化窗口的左指针(left)和右指针(right
    • 通常为数组或字符串的起始位置, 令left, right = 0, 0
  2. 移动窗口的右指针(right),扩大窗口,直到满足某个条件为止
    • 一般当右指针到达数组或字符串右边界时,停止扩大窗口
  3. 当窗口满足条件时,如果需要找到最小长度或最大长度,可以更新结果。
  4. 移动窗口的左指针(left),缩小窗口,直到不再满足条件为止。
  5. 重复步骤 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

最后,推荐一个在线调试的网站,可以直接在网页查看程序每一步骤的调用结果,对于理解程序是如何运行比较有帮助:

扫描二维码关注公众号,回复: 16579546 查看本文章

猜你喜欢

转载自blog.csdn.net/YuvalNoah/article/details/131610743