滑动窗口和双指针

news2025/3/10 5:30:27

滑动窗口和双指针

  • 一、循环不变量
    • 1.1 定义
    • 1.2 总结
  • 二、使用循环不变量写对代码
    • 2.1 注意
    • 2.2 总结
  • 三、滑动窗口
    • 3.1 固定长度的滑动窗口(同向交替移动的两个变量)
    • 3.2 不定长度的滑动窗口
      • 3.2.1 定义
      • 3.2.2 总结
    • 3.3 计数问题
      • 3.3.1 标准
      • 3.3.2 总结
    • 3.4 使用数据结构维护窗口性质
  • 四、链表中的双指针问题
  • 五、双指针:相向交替移动的两个变量
    • 5.1 定义
  • 六、小结

请添加图片描述

一、循环不变量

1.1 定义

循环前、中、后保持不变。循环不变量是指我们在编写代码的过程中,要一直循序不变的性质,这样的性质是根据要解决的问题,由我们自己定义的。循环不变量是我们写对一个问题的基础,保证了在初始化、循环遍历、结束这三个阶段相同的性质,使得一个问题能够被正确解决。

1.2 总结

区间不同的定义决定了不同的初始化逻辑、遍历过程中的逻辑。

二、使用循环不变量写对代码

2.1 注意

在写代码时一定要明确自己对变量以及区间的定义是什么,并且在编写代码的过程中保持定义不变。

2.2 总结

循环不变量是人为定义的,无需记忆。只要我们在编码的开始明确了我们对变量和区间的定义,写对代码就是水到渠成的事情了。

三、滑动窗口

3.1 固定长度的滑动窗口(同向交替移动的两个变量)

3.2 不定长度的滑动窗口

3.2.1 定义

1、有一类数组上的问题,需要使用两个指针变量(我们称为左指针和右指针),同向、交替向右移动完成任务。这样的过程像极了一个窗口在平面上滑动的过程,因此我们将解决这一类问题的算法称为滑动窗口问题。
2、掌握好这一类滑动窗口的问题,需要先从暴力解法开始分析,滑动窗口利用了问题本身的特点,在两个指针同向、交替向右移动的过程中,少考虑了很多暴力解法需要考察的情况,将时间复杂度降到了线性级别O(N)(这里N是数组的长度)。
在这里插入图片描述

3.2.2 总结

滑动窗口是一类通过使用两个变量在数组上同向交替移动解决问题的算法。这一类问题的思考路径通常是:先思考暴力解法,分析暴力解法的缺点(一般而言暴力解法的缺点是重复计算),然后结合问题的特点,使用双指针技巧对暴力解法进行剪枝。因此,思考算法设计的合理性是更关键的,这一点适用于所有算法问题。
(1)left 和 right 同方向移动;
(2)定义条件,即我们需要时刻检测的一件事情;
(3)原理:充分利用本题本身的特点,以减少不必要的计算;
(4)利用循环不变量保证代码边界正确;
(5)不要记忆代码模板,应该结合具体问题分析出什么时候滑动窗口最长,什么时候滑动窗口最短;
(6)掌握处理字符串的技巧。

3.3 计数问题

3.3.1 标准

写对计数问题的标准:不重不漏。

3.3.2 总结

计数问题需要统一计数的标准。这一类问题需要仔细计算,一些代码的细节如果想不明白,可以在草稿纸上写出具体的例子帮助总结规律。

3.4 使用数据结构维护窗口性质

四、链表中的双指针问题

五、双指针:相向交替移动的两个变量

5.1 定义

双指针是指通过两个变量交替相向移动完成任务的算法,具体来说,可以使用两个变量 i 和 j ,初始的时候,i 和 j 分别指向数组的第一个元素和最后一个元素,然后指针 i 不断向右移动, 指针 j 不断向左移动,直到它们相遇。这样设计的算法少考虑了很多暴力解法需要考虑的情况,如下图所示。
在这里插入图片描述

六、小结

不管是滑动窗口还是双指针问题,其实都是在完成任务的过程中使用了一些变量帮助我们以线性时间复杂度完成题目交给的任务,理解它们基于对问题本身的理解,大家在做题的过程中需要体会这两种算法都是对暴力解法的优化。这一专题的内容并不难,但是掌握好它们需要一定量的练习,最好的办法也是看起来最笨的办法。我们给出一些学习过程中的建议:
(1)画图分析
(2)通过具体的、恰当的例子归纳解题思路
(3)遇到问题的时候一定不能急躁,在代码中打印出变量的值,观察变量的值是不是按照我们设计的逻辑进行的,这样的办法也是最有效的办法
(4)理解循环不变量,并利用好循环不变量,这个非常朴素的、在写对代码的过程中一定需要保证的性质

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

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

相关文章

three.js(一)创建场景添加物体

目录 前言 一、创建Three世界 1.导入Three.js 2.引入three 3.创建基本结构 4.创建场景、相机、渲染器 场景 相机 渲染器 二、向场景中存放物体 1.创建一个物体 几何体 材质 网格模型 前言 官方网站https://threejs.org/网站目录翻译 文档连接https://threejs.org/…

postgresql-条件表达式

postgresql-条件表达式 简单Case表达式搜索Case表达式缩写函数总结 简单Case表达式 select e.first_name , e.last_name , e.department_id , case e.department_id when 90 then 管理when 60 then 开发else 其他end as "部门" from cps.public.employees e ;-- 统…

JavaWeb 文件上传和下载

目录 一、文件上传 1.文件上传和下载的使用说明 : 2.文件上传基本原理 : 3.文件上传经典案例 : 3.1 页面实现: 3.2 servlet实现 : 3.3 工具类实现 : 3.4 运行测试 : 3.5 注意事项 : 二、文件下载 1.文件下载基本原理 : 2.文件下载经典案例 : 2.1 准备工作 2.2 页面…

2022年03月 C/C++(六级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C++编程(1~8级)全部真题・点这里 第1题:多项式相加 我们经常遇到两多项式相加的情况, 在这里, 我们就需要用程序来模拟实现把两个多项式相加到一起。 首先, 我们会有两个多项式,每个多项式是独立的一行, 每个多项式由系数、 幂数这样的多个整数对来表示。 如多项式 2…

专业的视觉特效处理包,FxFactory 8 Pro for Mac助您打造精彩视频

FxFactory 8 Pro for Mac是一款强大的视觉特效处理包,专门为Mac用户设计。它集成了超过200种高质量的视觉效果和过渡效果,可以轻松地应用于各种视频项目中。该软件提供了一个直观的界面,用户可以通过简单拖放操作将特效应用到视频片段上。它支…

【golang】调度系列之goroutine

前面的两篇,从相对比较简单的锁的内容入手(也是干货满满),开始了go的系列。这篇开始,进入更核心的内容。我们知道,go应该是第一门在语言层面支持协程的编程语言(可能是我孤陋寡闻),goroutine也完全算的上是go的门面。g…

[SpringBoot3]博客管理系统(源码放评论区了)

八、博客管理系统 创建新的SpringBoot项目,综合运用以上知识点,做一个文章管理的后台应用。依赖: Spring WebLombokThymeleafMyBatis FrameworkMySQL DriverBean Validationhutool 需求:文章管理工作,发布新文章&…

Web安全——穷举爆破上篇(仅供学习)

Web安全 一、概述二、常见的服务1、burpsuite 穷举后台密码2、burpsuite 对 webshell 穷举破解密码3、有 token 防御的网站后台穷举破解密码3.1 burpsuite 设置宏获取 token 对网站后台密码破解3.2 编写脚本获取token 对网站后台密码破解 4、针对有验证码后台的穷举方法4.1 coo…

华为云云服务器评测 [Vue3 博物馆管理系统] 使用Vue3、Element-plus菜单组件构建轮播图

系列文章目录 第一章 定制上中下(顶部菜单、底部区域、中间主区域显示)三层结构首页 第二章 使用Vue3、Element-plus菜单组件构建菜单 第三章 使用Vue3、Element-plus菜单组件构建轮播图 [第四章 使用Vue3、Element-plus菜单组件构建组图文章] 华为云云…

WebSocket(一)

一.什么是WebSocket 【1】WebSocket是一种协议,设计用于提供低延迟,全双工和长期运行的连接。 全双工:通信的两个参与方可以同时发送和接收数据,不需要等待对方的响应或传输完成。 【2】比较 传统通信(http协议&am…

QML与C++的交互操作

QML旨在通过C 代码轻松扩展。Qt QML模块中的类使QML对象能够从C 加载和操作,QML引擎与Qt元对象系统集成的本质使得C 功能可以直接从QML调用。这允许开发混合应用程序,这些应用程序是通过混合使用QML,JavaScript和C 代码实现的。除了从QML访问…

15年检测生涯转瞬即逝,复旦MBA助力邢国芒实现质量强国梦

日月光华,旦复旦兮!复旦MBA如同一个巨大的磁场,吸引了诸多来自五湖四海、各行各业的职场精英。从初入职场的青涩懵懂到如今的独当一面专业干练,他们逐渐成长为职场的中坚力量,在各自领域内发光发热。作为新时代的青年&…

多线程应用——阻塞队列

阻塞队列 文章目录 阻塞队列1.队列的概念2.阻塞队列3.现实中的例子4.消息队列5.使用队列的优势1.解耦2.削峰填谷3.异步操作 6.实现 1.队列的概念 一种先进先出的数据结构 2.阻塞队列 队列写元素是从队尾插入,从对头取出 当插入元素时,先判断一下队列…

数据治理-数据管理框架

DMBOK2提出的想法和概念在不同的组织中都可以应用,组织所采用的数据管理方法取决于某些关键要素,如其所处行业、所应用的数据范围、企业文化、成熟度、战略、愿景以及待解决的问题和挑战。 战略一致性模型和阿姆斯特丹模型,展示了组织管理数…

算法通关村第十二关——字符串反转问题解析

前言 字符串反转是关于字符串算法里的重要问题,虽然不是太难,但需要考虑到一些边界问题。本篇文章就对几道字符串反转题目进行分析。 1.反转字符串 力扣344题,编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数…

opencv 提取选中区域内指定hsv颜色的水印

基于《QT 插件化图像算法研究平台》做的功能插件。提取选中区域内指定hsv颜色的水印。 《QT 插件化图像算法研究平台》有个HSV COLOR PICK功能,可以很直观、方便地分析出水印 的hsv颜色,比如, 蓝色:100,180,0,255,100,255。 然后利用 opencv …

JavaScript中关于数组的小挑战

史蒂芬仍在建立他的小费计算器,使用的规则与以前一样: 如果账单价值在50到300之间,小费为账单的15%,如果价值不同,小费为20%。 编写一个函数’calcTip’,将任何账单值作为输入,并返回相应的小费…

【业务功能篇94】微服务-springcloud-springboot-认证服务-注册功能-第三方短信验证API

商城认证服务 一、搭建认证服务环境 结合我们前面介绍的商城的架构我们需要单独的搭建一个认证服务。 1.创建项目 首先创建一个SpringBoot项目&#xff0c;然后添加对应的依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"htt…

MySQL主从复制与读写分离 及其实例

目录 主从复制与读写分离 1、MySQL主从复制原理 1.1、MySQL的复制类型 1.2、MySQL主从复制的工作过程 1.3、mysq支持的复制类型 1.4、 数据流向 1.5、主从复制的工作过程 2、读写分离 2.1、什么是读写分离&#xff1f; 2.2、为什么要读写分离呢&#xff1f; 2.3、什么…

HFSS 3维曲线导入

HFSS 3维曲线导入 简介环境参考代码使用结果 简介 如图一所示&#xff0c;CST中可以通过导入和到出由任意点组成的曲线&#xff0c;但是HFSS中貌似不能导入&#xff08;如图二所示&#xff09;&#xff0c;如果我们要将matlab的产生的曲线的点的数据导入特变麻烦&#xff0c;特…