【刷题】滑动窗口入门

送给大家一句话:
那脑袋里的智慧,就像打火石里的火花一样,不去打它是不肯出来的。——莎士比亚
滑动窗口入门
- 认识滑动窗口
- Leetcode 209. 长度最小的子数组
- 题目描述
- 算法思路
- Leetcode 3. 无重复字符的最长子串
- 题目描述
- 算法思路
- Leetcode 1004. 最大连续1的个数 III
- 题目描述
- 算法思路
- 总结
- 送给大家一句话:
- Thanks♪(・ω・)ノ谢谢阅读!!!
- 下一篇文章见
今天我学习了滑动窗口的算法思路,接下来请与我一起看看吧!!!
认识滑动窗口
滑动窗口问题可以说是一种特殊的双指针问题,通常用于解决以下类型的问题:
- 连续子数组或子字符串问题:例如,找出一个数组中连续元素和最大或最小的子数组,或者在字符串中找到一个包含特定字符的最短子字符串。
- 固定窗口大小问题:当窗口大小固定时,我们可以通过移动窗口来遍历整个数组或字符串,并记录所需的统计信息。
- 可变窗口大小问题:在某些情况下,窗口的大小可能会根据特定条件而变化。这需要我们在遍历过程中动态地调整窗口的大小。
滑动窗口算法的基本思想是使用双指针(有时也可能使用更多指针)来表示窗口的边界。在每一步中,我们可以根据特定条件来移动窗口的边界,并更新所需的统计信息。
看这些定义是真无法想象出来哦怎么个滑动窗口的,下面我们一起来做题吧:
Leetcode 209. 长度最小的子数组
题目描述

看这个题目还是很好理解的,只需要我们找到和大于target的连续子数组,我们来看第一个样例target = 7, nums = [2,3,1,2,4,3] 显然4,3是最小的子数组。接下来分析一下算法思路:
算法思路
根据题目要求,首先可以想到的是暴力枚举算法(遇事不决,暴力解决),遍历穷举出所有的连续子数组,寻找满足要求的子数组,最终就找到了最小的连续子数组:
class Solution {
public:int minSubArrayLen(int s, vector<int>& nums) {//暴力解法int n = nums.size();if (n == 0) {return 0;}//默认为最大值int ans = INT_MAX;//开始遍历for (int i = 0; i < n; i++) {//重置sum值int sum = 0;//判断子数组是否满足for (int j = i; j < n; j++) {sum += nums[j];if (sum >= s) {//满足就更新结果ans = min(ans, j - i + 1);break;}}}return ans == INT_MAX ? 0 : ans;}
};
这样暴力的算法的时间复杂度是O(n^2),我们看看可不可以进行优化:
来看图解(来着力扣官方)
这样就模拟了滑动窗口:
做法:将右端元素划⼊窗⼝中,统计出此时窗⼝内元素的和:
- 如果窗⼝内元素之和⼤于等于 target :更新结果,并且将左端元素划出去的同时继续判
断是否满⾜条件并更新结果(因为左端元素可能很⼩,划出去之后依旧满⾜条件) - 如果窗⼝内元素之和不满⾜条件: right++ ,另下⼀个元素进⼊窗⼝。
class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int left = 0,right = 0;//设置为最大值 保证没有满足的子数组时可以判断int len = INT_MAX;int sum = 0;sum += nums[left];while(left < nums.size() && right < nums.size()){//if(sum < target ){right++;if(right < nums.size())sum += nums[right];}while (sum >= target){len = min (right - left + 1 , len) ;sum -= nums[left];left++;}}return len == INT_MAX ? 0:len;}
};
这样大大提高了算法的效率!!!
为何滑动窗⼝可以解决问题,并且时间复杂度更低?
- 这个窗⼝寻找的是:以当前窗⼝最左侧元素(记为 left1 )为基准,符合条件的情况。也就是在这道题中,从 left1 开始,满⾜区间和 sum >= target 时的最右侧(记为right1 )能到哪⾥。
- 我们既然已经找到从 left1 开始的最优的区间,那么就可以⼤胆舍去 left1 。但是如果继续像⽅法⼀⼀样,重新开始统计第⼆个元素( left2 )往后的和,势必会有⼤量重复的计算(因为我们在求第⼀段区间的时候,已经算出很多元素的和了,这些和是可以在计算下次区间和的时候⽤上的)。
- 此时, rigth1 的作⽤就体现出来了,我们只需将 left1 这个值从sum 中剔除。从right1 这个元素开始,往后找满⾜ left2 元素的区间(此时right1 也有可能是满⾜的,因为 left1 可能很⼩。 sum 剔除掉 left1 之后,依旧满⾜⼤于等于target )。这样我们就能省掉⼤量重复的计算。
这样我们不仅能解决问题,⽽且效率也会⼤⼤提升
继续我们来看下一题
Leetcode 3. 无重复字符的最长子串
题目描述

描述也是十分简单奥,我们接着来看如何解决
算法思路
首先想到的还是暴力枚举啊,我们可以借助哈希表来确定是否重复。
枚举过程中就会发现左右指针移动方向相同,所以可以进行滑动窗口
- 入窗口(右指针移动)
- 判断(判断是否需要移动左指针)
- 出窗口
- 更新结果
class Solution {
public:int lengthOfLongestSubstring(string s) {int len = 0;int n = s.size();//使用哈希进行判断是否重复int hash[128] = {0};int ret = 0;for(int left = 0,right = 0; right < n; right++){//进入窗口hash[s[right]]++;//判断while(hash[s[right]] > 1){//出窗口hash[s[left]]--;left++;len--;}//更新结果len++;ret = max(len,ret);}return ret;}
};
这样就完美解决。
其实滑动窗口都是可以套用上面的模版的,不信?来看下一题
Leetcode 1004. 最大连续1的个数 III
题目描述

题目描述依然简单奥,只是判断条件发生了改变,我们需要来定义一个数字来比较是否满足少于k
算法思路
依旧是:
- 入窗口(右指针移动)
- 判断(判断是否需要移动左指针)
- 出窗口
- 更新结果
class Solution {
public:int longestOnes(vector<int>& nums, int k) {int tmp = 0,left = 0,right = 0,n = nums.size();int ret = 0;while(right < n){if(nums[right] == 0) {tmp++; }while(tmp > k){if(nums[left] == 0) tmp--;left++;}ret = max(ret,right - left + 1);right++;}return ret;}
};
这样就成功完成解题!!!
总结
滑动窗口问题是可以通过模版来解决:
- 入窗口(右指针移动)
- 判断(按题分析判断是否需要移动左指针)
- 出窗口
- 更新结果
这样基本滑动窗口都可以解决,但重要的是理解滑动窗口的思路是如何得到的,是如何从暴力算法优化出来的。
送给大家一句话:
那脑袋里的智慧,就像打火石里的火花一样,不去打它是不肯出来的。——莎士比亚
Thanks♪(・ω・)ノ谢谢阅读!!!
下一篇文章见
相关文章:
【刷题】滑动窗口入门
送给大家一句话: 那脑袋里的智慧,就像打火石里的火花一样,不去打它是不肯出来的。——莎士比亚 滑动窗口入门 认识滑动窗口Leetcode 209. 长度最小的子数组题目描述算法思路 Leetcode 3. 无重复字符的最长子串题目描述算法思路 Leetcode 1004…...
【Python 48小时速成 3】输入与输出
在 Python 中,输入和输出通常通过内置函数来实现。主要的输入函数是 input(),用于从用户获取输入,而输出函数则是 print(),用于将结果打印到控制台。以下是简单的代码示例演示了输入和输出: # 输入示例 name input(&…...
API开发小红书接口获得小红书笔记详情API接口请求接入演示
为了使用小红书的API接口获取笔记详情,你需要遵循以下步骤: 注册并登录开放平台,创建一个应用并获取App Key和App Secret。 使用App Key和App Secret获取访问令牌(Access Token)。 使用访问令牌(Access T…...
Python条件语句深度解析:从基础到应用的全面指南
🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 📘 一、引言 📝 二、…...
【leetcode热题】 地下城游戏
恶魔们抓住了公主并将她关在了地下城 dungeon 的 右下角 。地下城是由 m x n 个房间组成的二维网格。我们英勇的骑士最初被安置在 左上角 的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。 骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0…...
Centos7安装ffmpeg
Centos7安装ffmpeg 用到的包压缩并安装 用到的包 压缩并安装 tar xvJf ffmpeg-5.0.1.tar.xz yum install -y gcctar -zxvf yasm-1.3.0.tar.gz cd yasm-1.3.0 ./configure make && make install yasm --versionyum install -y bzip2tar jxvf nasm-2.14.02.tar.bz2 cd n…...
安卓面试题多线程 81-85
81. 共享变量在多线程下如何保证线程安全?因为多线程是交替执⾏,每个线程操作共享变量时可能会导致数据不⼀致,要确保线程 安全,需要在访问共享变量时添加同步机制。当然,如果这个变量本⾝是线程安全的,⽐如AtomicLong,那么多线程访问也是安全 的🚀🚀🚀🚀🚀�…...
Java基础知识总结(8)
StringBuilder类(是线程不安全的) StringBuffer 和 StringBuilder二者及其相似,下面是构造方法: StringBuilder StringBuilder()创建空对象,空的字符序列 StringBuilder StringBuilder(StringBuilder builder)传入对象创造字符序列 Strin…...
C++基础入门(命名空间,函数,引用)
文章目录 前言1,命名空间2,函数函数重载缺省参数内联函数 3,引用尾声 前言 欢迎来到这篇关于C的入门博客!C是一门强大而又广泛应用的编程语言,作为一门面向对象的编程语言,C可以让你更好地组织和管理代码,提高代码的重用性和可维…...
【译】矢量数据库 101 - 什么是矢量数据库?
原文地址:Vector Database 101 - What is a Vector Database? 1. 简介 大家好——欢迎回到 Milvus 教程。在上一教程中,我们快速浏览了每天产生的日益增长的数据量。然后,我们介绍了如何将这些数据分成结构化/半结构化数据和非结构化数据&…...
Python Web开发记录 Day12:Django part6 用户登录
名人说:东边日出西边雨,道是无晴却有晴。——刘禹锡《竹枝词》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 1、登录界面2、用户名密码校验3、cookie与session配置①cookie与session②配置4、登录验证5、注销登录6、图片验证码①Pillow库②图片验证码的…...
SpringTask实现的任务调度与XXL-job实现的分布式任务调度【XXL-Job工作原理】
目录 任务调度 分布式任务调度 分布式任务调度存在的问题以及解决方案 使用SpringTask实现单体服务的任务调度 XXL-job分布式任务调度系统工作原理 XXL-job系统组成 XXL-job工作原理 使用XXL-job实现分布式任务调度 配置调度中心XXL-job 登录调度中心创建执行器和任务 …...
【java】图书管理系统
有了前几篇文章关于封装、继承、多态、接口等的介绍,想必各位读者对java面向对象的思想有了一定的认识。接下来这篇文章就让我们趁热打铁,利用所学知识做一个小项目图书管理系统吧 目录 一、图书类 1、book类 2、bookList类 二、功能实现 1、IOpera…...
C#实现约瑟夫环算法
目录 1.约瑟夫环定义 2.约瑟夫环算法实现需要注意的地方 3.通过一个例子来演示这个过程 4.三人的约瑟夫环示例 4.十二人的约瑟夫环示例 1.约瑟夫环定义 约瑟夫环即设有n个人坐成一个圈,从某个人开始报数,数到m的人出列,接着从出列的下一…...
游戏服务端配置“热更”及“秒启动”终极方案(golang/ygluu/卢益贵)
游戏服务端配置“热更”及“秒启动”终极方案 ygluu 卢益贵 关键词:游戏微服务架构、游戏服务端热更、模块化解耦、golang 目录 一、前言 二、异步线程加载/重载方案 三、配置表碎片化方案 四、指针间接引用 五、重载通知 六、示例代码 七、相关连接 一、…...
鸿蒙开发的入门
鸿蒙开发的入门 注册并实名认证华为开发者账户 华为官网 注册 有账户可以直接登录 并进行实名认证 下载并安装开发工具 鸿蒙开发使用的语言 java js c/c 仓颉 手机app java 硬件 c/c 应用开发工具的下载地址 Windows(64-bit) 下载地址 程序的运行过程 解析config.j…...
为什么要减少Http的请求以及如何减少Http请求
为什么要减少Http的请求 减少 HTTP 请求的数量是优化网页性能的一个重要策略,原因有以下几点: 1.延迟:每个 HTTP 请求都会有一定的网络延迟。即使数据量很小,请求和响应的往返时间也可能相当长,特别是在网络条件不好…...
Linux性能测试工具整理
性能测试工具:Unixbench lmbench stream iozone fio netperf spec2000 spec2006 一、unixbench unixbench主要是用于系统基础性能测试,unixbench也包含一些非常简单的2D和3D图形测试 UnixBench一个基于系统的基准测试工具,不单纯是CPU 内存 …...
前端路由history路由和hash路由的区别?原理?
前端路由是指在单页应用程序(SPA)中通过改变 URL 路径来实现页面切换和导航的机制。在前端开发中,有两种主要的前端路由实现方式:基于 History API 的路由(history-based routing)和基于哈希(Ha…...
AcWing 727. 菱形——像拼图一样做题
题目描述] 分析: 利用程序根据输入的整数,画出由字符*构成的该整数阶的实心菱形。给出一个示例: n 7 n7 n7。 * * * * * * * * * * * * * * * * * * * * * * * * * 我们将采取拆解问题,通过四个部分的…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
