算法 | 滑动窗口算法笔记

滑动窗口算法是一种处理数组或字符串子区间问题的方法,通过移动窗口的左右指针在O(N)时间内寻找符合条件的子数组。文章提供了LeetCode的一道题例,即找到和大于等于目标值的最短连续子数组,解释了如何使用滑动窗口法解决此类问题,并给出了Python代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

滑动窗口:核心思想

核心思想:维护一个窗口(又叫做子区间),通过调整窗口的起始位置(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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是希望

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值