当前位置: 首页 > news >正文

LeetCode 209. 长度最小的子数组

滑动窗口,初始时left和right都指向第一个位置。如果和小,那么right右移。如果和大于等于,满足条件形成了子数组,left右移,缩小左边界,寻找新的结果。

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int len=nums.length;
        int left=0,right=0;
        int min=Integer.MAX_VALUE;//记录最小子数组的大小
        int sum=0;
        while(right<len){
            sum+=nums[right];//将数字加入子数组
            //问题求:其总和大于等于 target
            while(sum>=target){//找到一个子数组[left,right]
                min=Math.min(min,right-left+1);
                sum-=nums[left];
                left++;
            }
            //sum<target
            right++;
        }
        return min==Integer.MAX_VALUE?0:min;//无结果,返回0
    }
}

什么时候使用滑动窗口?

维护一个可以滑动的窗口,在数组或字符串等线性数据结构上进行高效的操作。

1. 子数组或子字符串问题

  • 问题特征:当问题要求在一个数组或字符串中找出满足特定条件的连续子数组或子字符串时,滑动窗口往往是一个不错的选择。例如,需要找出和满足一定条件(如和大于等于某个值、和等于某个值)的最短或最长连续子数组,或者找出包含特定字符的最短或最长连续子字符串等。
  • 示例题目
    • 209. 长度最小的子数组:给定一个含有 n 个正整数的数组和一个正整数 target,找出该数组中满足其和 ≥ target 的长度最小的连续子数组。可以使用滑动窗口不断调整窗口的大小和位置,找到满足条件的最小子数组长度。
    • 76. 最小覆盖子串:给定一个字符串 s 和一个字符串 t,在 s 中找到包含 t 中所有字符的最小子串。通过滑动窗口,在 s 上移动窗口,不断调整窗口的左右边界,找到满足条件的最小子串。

2. 固定大小窗口问题

  • 问题特征:问题要求处理固定大小的连续子数组或子字符串。在这种情况下,可以使用一个固定大小的滑动窗口在数据结构上滑动,依次处理每个窗口内的元素。
  • 示例题目
    • 剑指 Offer 57 - II. 和为 s 的连续正数序列:输入一个正整数 target,输出所有和为 target 的连续正整数序列(至少含有两个数)。可以使用一个固定大小的滑动窗口,从较小的窗口开始,逐步调整窗口大小,找到所有满足条件的连续正整数序列。
    • 643. 子数组最大平均数 I:给定一个由 n 个元素组成的整数数组 nums 和一个整数 k,找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数。使用固定大小为 k 的滑动窗口在数组上滑动,计算每个窗口内元素的和,进而得到最大平均数。

3. 区间统计问题

  • 问题特征:需要统计满足特定条件的区间数量。滑动窗口可以通过动态调整窗口的边界,高效地统计符合条件的区间。
  • 示例题目
    • 992. K 个不同整数的子数组:给定一个正整数数组 A,如果 A 的某个子数组中不同整数的个数恰好为 K,则称 A 的这个连续、不一定独立的子数组为好子数组。求 A 中好子数组的数目。可以使用两个滑动窗口分别统计不同整数个数小于等于 K 和小于等于 K - 1 的子数组数量,然后相减得到不同整数个数恰好为 K 的子数组数量。

4. 字符串匹配问题

  • 问题特征:在字符串匹配过程中,需要对连续的子字符串进行操作和判断。滑动窗口可以在字符串上滑动,检查每个窗口内的子字符串是否满足匹配条件。
  • 示例题目
    • 438. 找到字符串中所有字母异位词:给定两个字符串 sp,找到 s 中所有 p 的异位词的子串,返回这些子串的起始索引。使用滑动窗口在 s 上滑动,比较窗口内的字符频率和 p 的字符频率是否相同,从而找出所有的异位词子串。

判断是否使用滑动窗口的一般思路

  • 连续子结构:如果问题关注的是连续的子数组、子字符串等结构,那么可以考虑滑动窗口。
  • 动态调整:当需要根据当前窗口内的元素状态动态调整窗口的大小和位置时,滑动窗口通常是有效的方法。
  • 优化复杂度:如果使用暴力解法的时间复杂度较高(如 O ( n 2 ) O(n^2) O(n2) 或更高),而滑动窗口可以将时间复杂度优化到 O ( n ) O(n) O(n),那么滑动窗口是一个值得尝试的选择。

相关文章:

  • Vue2+Element实现Excel文件上传下载预览【超详细图解】
  • Flask 应用结构与模块化管理详细笔记
  • 什么是useMemo?何时使用它?
  • 什么是分布式事务?
  • 【文件基础操作】小笔记
  • Vulnhub靶场 Kioptrix: Level 1.3 (#4) 练习
  • 计算机毕业设计SpringBoot+Vue.js抗疫物资管理系统(源码+文档+PPT+讲解)
  • 【软考-架构】1.1、计算机硬件-CPU校验码
  • PostgreSQL使用pg_upgrade 从13升级到14
  • SocketTool、串口调试助手、MQTT中间件基础
  • 大白话html 第三章学习表格和表单
  • Python 爬虫与网络安全有什么关系
  • RabbitMQ操作实战
  • 迁移学习策略全景解析:从理论到产业落地的技术跃迁
  • 打造更 AI 的操作系统 《龙蜥+超级探访》第三期走进浪潮信息
  • 对rust中的from和into的理解
  • RA-Eco-RA2L1-48PIN-V1.0开发板RTC时钟
  • redis restore 命令的用法
  • 【深度学习】强化学习(RL)-A3C(Asynchronous Advantage Actor-Critic)
  • 快速使用通义千问大模型API + VUE
  • 找事做网站/google官网登录入口
  • 网站asp怎么没有菜单栏/如何优化关键词提升相关度
  • 读书网站怎么做/百度识图找原图
  • 学做网站要多久/百度认证官网
  • 网站建设项目延期验收申请/百度软件商店
  • 微信做一元云购网站/外包网络推广