每天一道算法练习题--Day20 第一章 --算法专题 --- ----------滑动窗口(思路 + 模板)

news2024/11/15 17:16:21

笔者最早接触滑动窗口是滑动窗口协议,滑动窗口协议(Sliding Window Protocol),属于 TCP 协议的一种应用,用于网络数据传输时的流量控制,以避免拥塞的发生。 发送方和接收方分别有一个窗口大小 w1 和 w2。窗口大小可能会根据网络流量的变化而有所不同,但是在更简单的实现中它们是固定的。窗口大小必须大于零才能进行任何操作。

我们算法中的滑动窗口也是类似,只不过包括的情况更加广泛。实际上上面的滑动窗口在某一个时刻就是固定窗口大小的滑动窗口,随着网络流量等因素改变窗口大小也会随着改变。接下来我们讲下算法中的滑动窗口。

介绍

滑动窗口是一种解决问题的思路和方法,通常用来解决一些连续问题。 比如 LeetCode 的 209. 长度最小的子数组。更多滑动窗口题目见下方题目列表。

常见套路

滑动窗口主要用来处理连续问题。比如题目求解“连续子串 xxxx”,“连续子数组 xxxx”,就应该可以想到滑动窗口。能不能解决另说,但是这种敏感性还是要有的。

从类型上说主要有:

  • 固定窗口大小
  • 窗口大小不固定,求解最大的满足条件的窗口
  • 窗口大小不固定,求解最小的满足条件的窗口(上面的 209 题就属于这种)

后面两种我们统称为可变窗口。当然不管是哪种类型基本的思路都是一样的,不一样的仅仅是代码细节。

固定窗口大小

对于固定窗口,我们只需要固定初始化左右指针 l 和 r,分别表示的窗口的左右顶点,并且保证:

  1. l 初始化为 0
  2. 初始化 r,使得 r - l + 1 等于窗口大小
  3. 同时移动 l 和 r
  4. 判断窗口内的连续元素是否满足题目限定的条件
  • 4.1 如果满足,再判断是否需要更新最优解,如果需要则更新最优解
  • 4.2 如果不满足,则继续。

在这里插入图片描述

可变窗口大小

对于可变窗口,我们同样固定初始化左右指针 l 和 r,分别表示的窗口的左右顶点。后面有所不同,我们需要保证:

  1. l 和 r 都初始化为 0
  2. r 指针移动一步
  3. 判断窗口内的连续元素是否满足题目限定的条件
  • 3.1 如果满足,再判断是否需要更新最优解,如果需要则更新最优解。并尝试通过移动 l 指针缩小窗口大小。循环执行 3.1
  • 3.2 如果不满足,则继续。

形象地来看的话,就是 r 指针不停向右移动,l 指针仅仅在窗口满足条件之后才会移动,起到窗口收缩的效果。

在这里插入图片描述

模板代码

伪代码

初始化慢指针 = 0
初始化 ans

for 快指针 in 可迭代集合
   更新窗口内信息
   while 窗口内不符合题意
      扩展或者收缩窗口
      慢指针移动
   更新答案
返回 ans

代码
以下是 209 题目的代码,使用 Python 编写,大家意会即可。

class Solution:
    def minSubArrayLen(self, s: int, nums: List[int]) -> int:
        l = total = 0
        ans = len(nums) + 1
        for r in range(len(nums)):
            total += nums[r]
            while total >= s:
                ans = min(ans, r - l + 1)
                total -= nums[l]
                l += 1
        return  0 if ans == len(nums) + 1 else ans

题目列表(有题解)

在这里插入图片描述

扩展阅读

https://leetcode.com/problems/binary-subarrays-with-sum/discuss/186683/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/487760.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习小结之KNN算法

文章目录 前言一、概念1.1 机器学习基本概念1.2 k 值1.3 距离度量1.4 加权方式 二、实现2.1 手写实现2.2 调库 Scikit-learn2.3 测试自己的数据 三、总结3.1 分析3.2 KNN 优缺点 参考 前言 ​ KNN (K-Nearest Neighbor)算法是一种最简单,也是一个很实用的机器学习的…

VLAD Diffusion,一个更好用且易于安装的Stable Diffusion Web UI

VLAD Diffusion 是我们前面介绍过的 AUTOMATIC1111/stable-diffusion-webui的一个定制的更新,它主要是为了更频繁发布的更新和错误修复。它包含 新的安装程序,并且提供了高级CUDA调优不在依赖Accelerate,因为Accelerate是分布式的&#xff0…

setTimeout不准时,CSS精准实现计时器功能

实际开发过程中,我们会经常遇到,首次进入页面进行相应提示,然后指定时间后自动消失或者前端时钟展示等需求。 按照传统方案,我们可以使用 setTimeout 实现。但其存在:实际延时比设定值更久的情况。 setTimeout 不准时…

单个案例奖金2000元!AidLux AI 应用案例悬赏征集活动第二期选题上线啦

AidLux AI 应用案例悬赏征集活动第一期开发者作品新鲜"出炉"啦! 得益于AidLux在AI应用部署端的极大优势,开发者们在短时间内轻松落地了大批AI应用。 其中,不乏后厨老鼠识别告警系统、粮食作物特定病虫害告警系统、基于视觉的仰卧起…

专注主业、管控风险,中国春来的“非激进式扩张”

近日,中国春来发布截至2023年2月28日止六个月的中期业绩公告,期内收入同比增长14.2%至7.49亿元,利润同比上涨32%至3.31亿元,交出了亮眼的成绩单。 探究中国春来业绩上涨的原因,关键在于扩大招生。而招生规模很大程度上…

ChatGPT终于被我问到胡说八道的程度了!

问:Python是强类型语言,还是弱类型语言 chatgpt:Python是强类型语言。Python很少会隐式地转换变量的类型,所以Python是强类型的语言 问:什么是强类型语言 chatgpt:强类型语言是指在编程语言中&#xff0…

自动控制原理笔记-频率响应法-系统的开环频率特性图的绘制

目录 一、系统的开环对数频率特性图(Bode图) 绘制方法I:(各环节的Bode图求和) 绘制方法II:(不求和,直接绘图) 二、系统的开环幅相特性图(Nyquist图、极坐标…

Linux网络编程——网络基础[1]

目录 1.网络发展 2.初识协议 2.1协议分层 2.2OSI七层模型 2.3TCP/IP四层(五层)模型 3.网络传输的基本流程 3.1协议报头 3.2局域网通信原理 3.3广域网通信原理 3.4数据包的封装和分用 4.网络中的地址管理 1.网络发展 计算机是帮助人解决计算问题的,而人…

实在智能出席第六届数字中国建设峰会,入围2022年信息技术应用创新优秀解决方案榜单

最美榕城四月天,山海之间尽显数字澎湃。这一周来,实在智能来到了“有福之州”,为数字中国建设增添实在色彩。 4月25日,实在华夏行抵达福州站,与众多生态合作伙伴携手共话数字发展新未来; 4月26日&#xff…

在DARTS空间中进行神经架构搜索(NAS)

前言 神经架构搜索(NAS):自动化设计高性能深度神经网络架构的技术神经架构搜索任务主要有三个关键组成部分,即: 模型搜索空间,定义了一个要探索的模型的集合一个合适的策略作为探索这个模型空间的方法一个模型评估器,…

全景丨0基础学习VR全景制作,平台篇第15章:热点功能-音图文

大家好,欢迎观看蛙色VR官方——后台使用系列课程! 功能说明 应用场景 热点,指在全景作品中添加各种类型图标的按钮,引导用户通过按钮产生更多的交互,增加用户的多元化体验。 音图文热点,即音频、图片、文字…

如何将redis部署在linux操作系统中:(十分详细的步骤)

一:通过虚拟机安装一个linux环境 注意:安装一个带有可视化界面的环境 将指标选中install centos7 按enter键 选择自己需要的语言 选中gui:桌面(可视化界面) 只需要配置软件设置即可,其他的则进行默认配置进行 root用…

【stm32疑难杂症】:Error: L6218E: Undefined symbol TIM_Cmd (referred from timer.o).

项目场景: 在使用工程是发现问题: ..\OBJ\OLED.axf: Error: L6218E: Undefined symbol TIM_Cmd (referred from timer.o). ..\OBJ\OLED.axf: Error: L6218E: Undefined symbol TIM_ITConfig (referred from timer.o). ..\OBJ\OLED.axf: Error: L6218E: …

少儿编程scratch

目录 少儿编程scratch 第一课 孙悟空72变 说绕口令的小猫 欢乐音乐会 海底世界 多变的章鱼哥 益虫与害虫 猫抓老鼠 监控报警器 神奇的画笔 小蝙蝠逃生记 森林里的体育课 寻找小狗哈哈 我是小小饲养员 青蛙王子 少儿编程scratch 第一课 需求描述:scratch的…

安卓缓存那些事情面试,一篇全部搞定

安卓缓存那些事情面试,一篇全部搞定 安卓缓存机制LruCache算法手写Bitmap的三级缓存一.为什么Bitmap三级缓存?二.原理三.代码 Bitmap的二次采样和质量压缩一.为什么二次采样二.哪二次采样三.代码:网络请求图片进行尺寸压缩四.质量压缩1.方法介绍2.案例&a…

携手中国电信打造 5G 智慧机场, ALVA Systems 创新 AR 应用闪耀云生态成果展

4 月 26 日,由国家网信办、国家发改委、科技部、工信部、国务院国资委、福建省人民政府共同主办,福州市人民政府等有关单位承办的第六届数字中国建设峰会数字福州暨生态大会在福州举办。 作为数字中国建设主力军之一,中国电信天翼云重磅亮相&…

Shell脚本编程入门--Day1

文章目录 什么是shell?变量环境变量的设置和显示特殊变量特殊的状态变量 什么是shell? 从技术角度,Shell的最简单定义:命令行解释器(command Interpreter)主要包含: 1, 将使用者的命令翻译给核…

COS 压测指南

COSBench 简介 COSBench 是一款由 Intel 开源,用于对象存储的压测工具。腾讯云对象存储(Cloud Object Storage,COS)作为兼容 S3 协议的对象存储系统,可使用该工具进行读写性能压测。 系统环境 工具推荐运行在 CentO…

PyCharm 下载安装教程(中文语言包)

文章目录 下载安装简单创建项目中文语言包 Py Charm是由JetBrains打造的一款Python IDE(Integrated Development Environment,集成开发环境) 下载 点击链接进入官网:https://www.jetbrains.com/pycharm/download/#sectionwindows …

PM864AK01-eA一极用于直流电压电平,地面是用于海底/地下电缆的永久返回路径

​ PM864AK01-eA一极用于直流电压电平,地面是用于海底/地下电缆的永久返回路径 高压直流输电 电力以交流电的形式产生和传输,但对于长距离传输,会产生很大的损耗,或者在两个交流系统无法同步的情况下。所以我们可以用直流输电的方…