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

【滑动窗口】一题讲透滑动窗口!

🚀个人主页:一颗小谷粒

🚀所属专栏:力扣刷题

很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~

目录

1.1 题目要求 

1.2 算法图解分析

1.3 代码实现

1.4 时间复杂度分析

1.5 算法思想总结


1.1 题目要求 

LeetCode.209 是一道非常经典的滑动窗口题目,题目如下:

209. 长度最小的子数组 - 力扣(LeetCode)

如果你不了解滑动窗口的话,那么只能通过暴力来解决,也就是通过两个for循环依次从左到右枚举,这么做的时间复杂度是O(n^2),那么有没有更高效的方法呢?

通过滑动窗口动态地调整子数组的范围,快速找到最优解:

1.2 算法图解分析

式例1:nums = [2,3,1,2,4,3]       target = 7

分别定义子数组的左边界 left 和右边界 right ,依次枚举子数组的右端点,也就是right

此时 right = 0 ,子数组的元素和sum = 2,因为不满足sum >= target(7) ,所以继续右移右端点

 此时 right = 1 ,子数组的元素和sum = 5,因为不满足sum >= target(7) ,继续右移右端点

直到 right = 3 时 ,子数组的元素和sum = 8,满足sum >= target(7) ,这时我们首先要记录子数组的元素个数res,然后再向右移动左端点,也就是缩小子数组的左边界,再次判断缩小后的子数组元素和sum 是否满足sum >= target(7)。不满足移动右端点,满足则缩小左边界。

当缩小左边界后,子数组的元素和sum = 6,因为不满足sum >= target(7) ,所以继续枚举右端点

继续移动右端点后sum = 10 , 满足sum >= target(7) ,这时我们记录子数组元素个数res,并继续向右移动左端点来缩小子数组的左边界,判断缩小后的子数组元素和sum 是否满足sum >= target(7)。不满足移动右端点,满足则缩小左边界。

缩小后sum = 7,依然满足 sum >= target(7),我们继续上一步操作

 此时sum = 6,因为不满足sum >= target(7) ,所移继续右移右端点

sum = 9,缩小左端点

sum = 7 ,缩小左端点  

最后 sum = 3,由于右端点移动到了终点,此时跳出循环,返回结果为最小的res

1.3 代码实现

    public int minSubArrayLen(int target, int[] nums) {int n = nums.length;int res = n + 1;int sum = 0;int left = 0;//枚举子数组右边界for (int right = 0; right < n; right++) {sum = sum + nums[right];//缩小左边界while (sum - nums[left] >= target) {sum = sum - nums[left];left++;}if (sum >= target) {//保存子数组元素个数res = Math.min(res, right - left + 1);}}return res <= n ? res : 0;}

1.4 时间复杂度分析

子数组的右端点是从左到右枚举的,它是O(n)的,子数组的左端点是不断缩小的,它也是O(n)的;因此这个算法的时间复杂度就是O(n)的。

空间复杂度:O(1)。仅用到若干额外变量。

1.5 算法思想总结

  1. 初始化窗口的左右边界,通常左边界和右边界都从数据结构的起始位置开始。
  2. 不断地移动右边界来扩展窗口,直到窗口满足特定条件(例如包含了所有目标元素)。
  3. 一旦满足条件,就尝试移动左边界来收缩窗口,同时保持条件仍然满足,目的是找到最小的满足条件的窗口大小或者窗口内容。
  4. 在整个过程中,根据需要记录窗口的状态、大小、元素等信息


刷题总是枯燥痛苦的,但是各位,计算机人是不怕吃苦的,万事开头难,不是看到了希望才去坚持,而是坚持了才有希望!最后由衷地祝愿所有的计算机人在学习的路上一路顺风,我们顶峰相见!博主微信:g2279605572 

相关文章:

【滑动窗口】一题讲透滑动窗口!

&#x1f680;个人主页&#xff1a;一颗小谷粒 &#x1f680;所属专栏&#xff1a;力扣刷题 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 1.1 题目要求 1.2 算法图解分析 1.3 代码实现 1.4 时间复杂度分析 1.5 算法思想总结 1.1 题目要…...

嵌入式通信原理—SPI总线通信原理与应用

文章目录 SPI 简介基本原理工作模式特点 SPI寻址方式1. 片选&#xff08;Chip Select, CS&#xff09;2. 多从设备通信3. 菊花链&#xff08;Daisy-Chain&#xff09;模式4. 地址寄存器&#xff08;应用层&#xff09; SPI通信过程时钟信号生成&#xff08;SCLK&#xff09;数据…...

基于web的 BBS论坛管理系统设计与实现

博主介绍&#xff1a;专注于Java .net php phython 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟 我的博客空间发布了1000毕设题目 方便大家学习使用 感兴趣的可以…...

【Scala入门学习】Scala的方法和函数

1. 方法 在scala中的操作符都被当成方法存在&#xff0c;比如说、-、*、/ 12就是1.(2)的调用&#xff0c; 2.0 是doule类型&#xff0c;强调用Int类型的写法为1.(2:Int) 1.1 方法的声明和使用 定义方法的语法&#xff1a; def 方法名([变量&#xff1a;变量类型&#xff…...

【JVM】概述

前言 Java的技术体系主要由支撑Java程序运行的虚拟机、提供各开发领域接口支持的Java类库、Java编程语言及许许多多的第三方Java框架&#xff08;如Spring、MyBatis等&#xff09;构成。在国内&#xff0c;有关Java类库API、Java语言语法及第三方框架的技术资料和书籍非常丰富&…...

鸿蒙开发笔记_电商严选02_登录页面跳转到我的页面、并传值

鸿蒙开发笔记整理,方便以后查阅! 由于上班较忙,只能抽空闲暇时间,快速整理更新中。。。 登录页面跳转到我的页面、并传值 效果图 我的设置页面 /*** 我的设置页面*/ import CommonConstants from ./CommonConstants import ItemData from ./ItemData import DataModel fr…...

clip论文阅读(Learning Transferable Visual Models From Natural Language Supervision)

目录 摘要训练pre-train model的过程将pre-train model应用于下游任务应用&#xff08;待更新&#xff09; 论文/项目地址&#xff1a;https://github.com/OpenAI/CLIP 提供了clip的pre-trained model的权重&#xff0c;也可安装使用pre-trained model 摘要 使用标签标注的图…...

用于图像分割的协 SMA Transformer:同多注意力转换器 !

在医学图像分割中&#xff0c;基于注意力机制和卷积神经网络的Transformer在提高性能方面起到了重要作用。然而&#xff0c;早期的模型往往在分割小而形状不规则的肿瘤时表现不佳。 为此&#xff0c;作者提出了一种基于SMA架构&#xff08;Synergistic Multi-Attention&#xf…...

lodash中_.difference如何过滤数组

_.difference(array, [values]) 作用&#xff1a; 创建一个具有唯一array值的数组&#xff0c;每个值不包含在其他给定的数组中。&#xff08;注&#xff1a;即创建一个新数组&#xff0c;这个数组中的值&#xff0c;为第一个数字&#xff08;array 参数&#xff09;排除了给…...

关于C# 数据库访问 转为 C++ CLI 数据库访问

Db_.cs 与 csharp_db.h功能是一样的。 Db_.cs /**************************************************************************************** 创建时间 &#xff1a;2006年12月19日文件名 &#xff1a;Db_.cs功能 &#xff1a;数据库…...

百度移动刷下拉词工具:快速出下拉词的技术分析

都2024年了&#xff0c;你还在做SEO百度下拉&#xff1f;答案当然是肯定的&#xff0c;虽然百度的搜索流量不如从前&#xff0c;但移动端的流量依然是巨大的&#xff01;除了百度SEO快排以外&#xff0c;下拉也是一大流量入口&#xff0c;尤其是在移动端搜索的流量越来越大时&a…...

学习笔记-Golang中的Context

文章目录 1、什么是Context2、Context的作用3、Context的解析3.1、Context的源码解析3.2、 context包中实现context接口的四种结构体类型3.2.1、emptyCtx3.2.2、cancelCtx3.2.3、timerCtx3.2.4、valueCtx 4、总结 1、什么是Context Context是 Go 语言中的一个标准库&#xff0…...

ArrayList 源码解析

ArrayList是Java集合框架中的一个动态数组实现&#xff0c;提供了可变大小的数组功能。它继承自AbstractList并实现了List接口&#xff0c;是顺序容器&#xff0c;即元素存放的数据与放进去的顺序相同&#xff0c;允许放入null元素&#xff0c;底层通过数组实现。除该类未实现同…...

libgit2编译

1. 源码下载 libgit2源码下载 2. 编译要求 CMake下载 CMake教程 3. 编译步骤 Prerequisites Make sure CMake on your %PATH% Build Create a build directory beneath the libgit2 source directory, and change into it: mkdir build && cd buildCreate the …...

mac新手入门(快捷键)

系统常用快捷键 基本操作 Command-Z 撤销Command-X 剪切  Command-C 拷贝&#xff08;Copy&#xff09; Option Shift Command V 纯文本拷贝 Command-V 粘贴  Command-A 全选&#xff08;All&#xff09;Command-S 保存&#xff08;Save) Command-F 查找&#xff0…...

curl 的使用详解

curl 是一个非常强大的命令行工具&#xff0c;用于通过各种协议&#xff08;如 HTTP、HTTPS、FTP 等&#xff09;传输数据。它广泛应用于测试 API、下载文件、调试网络请求等。 下面是 curl 常用功能的详解及示例&#xff1a; 基本语法 curl [options] [URL]1. 基本请求 发起…...

从基础到进阶:利用EasyCVR安防视频汇聚平台实现高效视频监控系统的五步走

随着科技的飞速发展&#xff0c;视频监控技术在社会安全、企业管理、智慧城市构建等领域扮演着越来越重要的角色。一个高效智能的视频监控管理系统不仅能够提升监控效率&#xff0c;还能在预防犯罪、事故预警、数据分析等方面发挥巨大作用。 一、需求分析 在设计视频监控管理…...

CORS漏洞及其防御措施:保护Web应用免受攻击

1. 背景- 什么是CORS&#xff1f; 在当今互联网时代&#xff0c;Web 应用程序的架构日益复杂。一个后端服务可能对应一个前端&#xff0c;也可能与多个前端进行交互。跨站资源共享&#xff08;CORS&#xff09;机制在这种复杂的架构中起着关键作用&#xff0c;但如果配置不当&…...

C语言自定义类型结构体(24)

文章目录 前言一、结构体类型的声明结构体回顾结构体的特殊声明结构体的自引用 二、结构体的内存对齐对齐规则为什么存在内存对齐&#xff1f;修改默认对齐数 三、结构体传参四、结构体实现位段什么是位段位段的内存分配位段的跨平台问题位段的应用位段使用的注意事项 总结 前言…...

补题篇--codeforces

传送门&#xff1a;Problem - 1881C - Codeforces 题目大意&#xff1a; 思路&#xff1a; 首先解决这个问题要知道 一个 ( x , y ) 顺时钟旋转 90 &#xff0c; 180 &#xff0c; 270可以得到 ( y , n - x 1 ) &#xff0c; ( n - x 1 , n - y 1 ) &#xff0c;( n - y …...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积

1.题目介绍 给定一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O…...

API网关Kong的鉴权与限流:高并发场景下的核心实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中&#xff0c;API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关&#xff0c;Kong凭借其插件化架构…...