滑动窗口和双指针

滑动窗口和双指针

  • 一、循环不变量
    • 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.mzph.cn/news/64242.shtml

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

相关文章

前端基础4——jQuery

文章目录 一、基本了解1.1 导入jQuery库1.2 基本语法1.3 选择器 二、操作HTML2.1 隐藏和显示元素2.2 获取与设置内容2.3 获取、设置和删除属性2.4 添加元素2.5 删除元素2.6 设置CSS样式 三、jQuery Ajax3.1 基本语法3.2 回调函数3.3 常用HTTP方法3.4 案例一3.4.1 准备工作3.4.2…

go语言配置

1、Go语言的环境变量 与Java等编程语言一样,安装Go语言开发环境需要设置全局的操作系统环境变量(除非是用包管理工具直接安装) 主要的系统级别的环境变量有两个: (1)GOROOT:表示Go语言环境在计算机上的安…

springboot docker

在Spring Boot中使用Docker可以帮助你将应用程序与其依赖的容器化,并简化部署和管理过程。 当你在Spring Boot中使用Docker时,你的代码不需要特殊的更改。你可以按照通常的方式编写Spring Boot应用程序。 java示例代码,展示了如何编写一个基…

lv3 嵌入式开发-3 linux shell命令(权限、输入输出)

1 Shell概述 随着各式Linux系统的图形化程度的不断提高,用户在桌面环境下,通过点击、拖拽等操作就可以完成大部分的工作。 然而,许多Ubuntu Linux功能使用shell命令来实现,要比使用图形界面交互,完成的更快、更直接。…

MOS场效应管

导体三极管中参与导电的有两种极性的载流子,所以也称为双极型三极管。本文将介绍另一种三极管,这种三极管只有一种载流子参与导电,所以也称为单极型三极管,因为这种管子是利用电场效应控制电流的,所以也叫场效应三极管…

JVM 垃圾收集器

重点:CMS,G1,ZGC 主要垃圾收集器如下,图中标出了它们的工作区域、垃圾收集算法,以及配合关系。 Serial 收集器 Serial 收集器是最基础、历史最悠久的收集器。 如同它的名字(串行)&#xff0c…

使用实体解析和图形神经网络进行欺诈检测

图形神经网络的表示形式(作者使用必应图像创建器生成的图像) 一、说明 对于金融、电子商务和其他相关行业来说,在线欺诈是一个日益严重的问题。为了应对这种威胁,组织使用基于机器学习和行为分析的欺诈检测机制。这些技术能够实时…

从0创建vite+vue3项目遇到的一些坑

使用ws自动创建的vitevue3项目后设置不了alias 答:不懂原理,但是有其他方法解决。直接在命令行执行“npm init vitelatest"后,一路选下去有create-vue的选项,就选这个create-vue创建;创建后会自动导入一个叫node…

滑动窗口最大值

题目链接 滑动窗口最大值 题目描述 注意点 只可以看到在滑动窗口内的 k 个数字返回 滑动窗口中的最大值1 < k < nums.length 解答思路 首先使用双端队列解决本题&#xff0c;队列中存储的是元素在数组中的下标&#xff0c;不断往队尾添加元素下标。在双端队列中&…

【图解算法数据结构】分治算法篇 + Java代码实现

文章目录 一、重建二叉树二、数值的整数次方三、打印从 1 到最大的 n 位数四、二叉搜索树的后序遍历序列五、数组中的逆序对 一、重建二叉树 public class Solution {int[] preorder;HashMap<Integer, Integer> dic new HashMap<>();public TreeNode buildTree(in…

算法:分治思想处理归并递归问题

文章目录 算法原理实现思路典型例题排序数组数组中的逆序对计算右侧小于当前元素的个数 总结 算法原理 利用归并思想进行分治也是很重要的一种思路&#xff0c;在解决逆序对的问题上有很大的需求空间 于是首先归并排序是首先的&#xff0c;归并排序要能写出来&#xff1a; c…

Linux学习之vsftpd虚拟用户

/etc/vsftpd/vsftpd.conf里边有几项跟vsftpd虚拟用户有关的主要配置&#xff1a; guest_enableYES&#xff0c;允许匿名用户登录vsftpd guest_usernamevirtual&#xff0c;指定虚拟用户账户为virtual&#xff0c;就是把虚拟用户映射成Linux本地用户&#xff0c;这样可以使用Lin…

【C++】C++11新特性(下)

上篇文章&#xff08;C11的新特性&#xff08;上&#xff09;&#xff09;我们讲述了C11中的部分重要特性。本篇接着上篇文章进行讲解。本篇文章主要进行讲解&#xff1a;完美转发、新类的功能、可变参数模板、lambda 表达式、包装器。希望本篇文章会对你有所帮助。 文章目录 一…

用反射实现自定义Java对象转化为json工具类

传入一个object类型的对象获取该对象的class类getFields方法获取该类的所有属性对属性进行遍历&#xff0c;并且拼接成Json格式的字符串&#xff0c;注意&#xff1a;通过属性名来推断方法名获取Method实例通过invoke方法调用 public static String objectToJsonUtil(Object o…

MVC模式分层练习

新建库 新建表 插入点数据 先不用MVC模式写功能,来看下缺点是什么 新建一个空项目 选项项目使用的JDK 自己的IDEA总是要重启下 新建模块 因maven还没教 添加框架支持 添加后项目多了这些 添加些必要依赖 这里注意下,如果导入jar包不对可以重新导入下或者是jar包本身出了问…

C语言每日一练--------Day(8)

本专栏为c语言练习专栏&#xff0c;适合刚刚学完c语言的初学者。本专栏每天会不定时更新&#xff0c;通过每天练习&#xff0c;进一步对c语言的重难点知识进行更深入的学习。 今日练习题关键字&#xff1a;图片整理 寻找数组下标 &#x1f493;博主csdn个人主页&#xff1a;小小…

安防监控/视频存储/视频汇聚平台EasyCVR接入海康Ehome车载设备出现收流超时的原因排查

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。视频汇聚平台既具…

C++ for 循环

for 循环允许您编写一个执行特定次数的循环的重复控制结构。 语法 C 中 for 循环的语法&#xff1a; for ( init; condition; increment ) {statement(s); }下面是 for 循环的控制流&#xff1a; init 会首先被执行&#xff0c;且只会执行一次。这一步允许您声明并初始化任…

1688API技术解析,实现关键词搜索淘宝商品(商品详情接口等)批量获取,可高并发

要使用1688API接口采集商品详情&#xff0c;可以按照以下步骤进行&#xff1a; 获取API接口权限&#xff1a;申请1688的app key和app secret&#xff0c;并获取access_token。 编写API请求代码&#xff1a;使用Python等编程语言&#xff0c;编写API请求代码。以下是一个Python…

ARM Cortex-M 的 SP

文章目录 1、栈2、栈操作3、Cortex-M中的栈4、MDK中的SP操作流程5、Micro-Lib的SP差别1. 使用 Micro-Lib2. 未使用 Micro-Lib 在嵌入式开发中&#xff0c;堆栈是一个很基础&#xff0c;同时也是非常重要的名词&#xff0c;堆栈可分为堆 (Heap) 和栈 (Stack) 。 栈(Stack): 一种…