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

春招Leetcode刷题日记-D4-双指针算法-滑动窗口快慢指针

D4-双指针算法-滑动窗口&&快慢指针

  • 快慢指针算
    • 力扣141. 环形链表
      • 思路
      • 代码
    • 力扣142. 环形链表 II
      • 思路
      • 代码
  • 滑动窗口
    • 力扣76. 最小覆盖子串
      • 思路
      • 代码
    • 力扣424. 替换后的最长重复字符
      • 思路
      • 代码


快慢指针算

快慢指针算法,多用于链表当中,常见的如:快慢指针判断链表中是否含有环路&&快慢指针找链表中点问题

力扣141. 环形链表

题目链接:141. 环形链表
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路

这是非常经典的,Floyd判圈法,即利用快慢指针,判断链表中是否含有环路。

1、初始时,slow、fast都在开头节点
2、fast一次走两步,slow一次走一步
3、如果含有环路,二者一定在环路中相遇;反之fast先走到尾节点

代码

class Solution {
public:bool hasCycle(ListNode *head) {ListNode *slow = head, *fast = head;while (fast != nullptr&&fast->next != nullptr) {//快慢指针判断条件!!!slow = slow->next;fast = fast->next->next;if (slow == fast) {return true;}}return false;}
};

力扣142. 环形链表 II

题目链接:142. 环形链表 II
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路

本题为上一题的进阶版本,我们不仅要判断是否含有环路,还要判断环路的进入节点,并返回。
1、所以,我们第一步就是利用快慢指针,利用是否会有第一次相遇,判断出是否含有环路,思路同上一题。
2、当相遇时,二者处在环路中某一个节点,现在我们要通过分析快慢指针走过的步数,来进一步指定算法

1、设非环路部分链表共a个节点,环路部分链表共b个节点(a,b均未知,具体要看题目)
2、我们从头部出发,到达环路入口节点:要么直接走过去,即a步;要么走入环路,在环路中绕行整数个圈到达。综上,总步数为 a+nb(n为绕行圈数,为未知,看具体链表)
3、再来分析快慢指针已经走了多少步:分别设为f、s步
<1>f=2
s(快指针一次两步,慢指针一次一步)
<2>f=s+nb(快慢指针都同样走过了a步,快指针多比慢指针在环路中走了几圈,且n为未知)
所以f=2nb、s=nb
4、在当下,慢指针已经走了n
b步,根据上面分析,再走a步就是目标节点。但是,现在a是未知,根据上面分析,我直接从起点走a步也会到目标点。
5、综上,让快指针去链表头,让快慢指针同时按照一个速度出发,二者相遇的时候,同时走了a步,即为目标点

代码

class Solution {
public:ListNode *detectCycle(ListNode *head) {ListNode *slow = head, *fast = head;while (fast != nullptr&&fast->next != nullptr) {//快慢指针判断条件slow = slow->next;fast = fast->next->next;if (slow == fast) {//产生第一次相遇,证明含有环路,开始寻找目标点fast = head;//这里算法详见上面证明while (fast != slow) {fast = fast->next;slow = slow->next;}return slow;}}return nullptr;//不产生第一次相遇,不含有环路}
};

滑动窗口

1、滑动窗口,又名双指针法,左右两个指针(l,r),同方向且l<=r,用于区间搜索。
2、只要分析出滑动窗口法之后,马上想到滑窗固定大板子:

1、滑窗之中,一定要重点统计窗口内部数据情况,这个和窗口是否收缩有很大关系
2、总体思路就是,先进行右边界扩张,更新窗口内数据信息;再根据题意判断,是否左边界++,进行窗口收缩,收缩的话,一定注意更新窗口内数据信息
3、左右指针初始化为 0 -1

	int left = 0, right = -1;for (遍历一遍数组) {// c 是将移入窗口的字符char c = s[right];// 右移窗口right++;// 进行窗口内数据的一系列更新...   // 判断左侧窗口是否要收缩while (左指针需要移动,即窗口需要收缩) {// d 是将移出窗口的字符char d = s[left];// 左移窗口left++;// 进行窗口内数据的一系列更新...}

力扣76. 最小覆盖子串

题目链接:76. 最小覆盖子串
在这里插入图片描述
在这里插入图片描述

思路

本题要求我们在s中找一个片段,这个片段中必须包含t中全部出现的字母,即t中出现了2个a,那么目标片段必须出现2个a,且要求在所有满足要求的片段之中找到最短的(根据题意,答案一定唯一),这明显是区间搜索问题,马上想到滑窗法,立刻开始套模板

1、初始化 l=0,r=-1,针对滑窗,我们要统计滑窗内各个元素出现的个数,针对t,我们要统计出现了哪些元素,以及出现的次数。
2、每次先右边界++,扩充滑窗,更新滑窗内元素。
3、最重要的地方来了,如何判断是否缩小滑窗(即左边界++):如果当前滑窗内都为覆盖到所有目标元素,那么缩小滑窗之后,更是不可能覆盖。所以只有当扩充玩新元素后全覆盖到了,才考虑缩小滑窗。
4、为了看是否能达到覆盖,用sum记录还需要覆盖的字母总量,用tmp数组动态维护需要覆盖的各个字母剩余数量。
5、根据题意,当能覆盖之后,我们要这个片段尽可能的短,所以在缩小滑窗时候,当恰好排出这个元素之后,无法完全覆盖,这就代表着不缩小时,就是当前的满足要求的最短片段。所以,我们连续缩小滑窗,直到上述情况出现即可。为了让最终结果最小,要动态维护一个最短片段。

在这里插入图片描述

代码

注意:
1、字符串裁剪函数substr使用方式:
假设:string s = “0123456789”;
string sub1 = s.substr(5); //只有一个数字5表示从下标为5开始一直到结尾:sub1 = “56789”
string sub2 = s.substr(5, 3); //从下标为5开始截取长度为3位:sub2 = “567”
2、比如t串中只出现两个a,但窗口内出现了三个a,只有前两个算有效覆盖(既在t中出现,又满足出现次数),所以tmp就是用来动态维护这个事情

class Solution {
public:string minWindow(string s, string t) {int m = s.size(), n = t.size();//统计字符串t里面的字符信息vector<int> cnt1(128, 0);//统计t中各个字母出现的次数vector<bool> visit1(128, false);//看t中出现了哪些字母for (int i = 0; i < n; i++) {cnt1[t[i]]++;visit1[t[i]] = true;}//用来动态记录最短符合要求字串int min_l = -1, min_r = -1, mins = 1000001;//左边界,右边界,长度int l = 0, r = -1;//窗口左右指针int sum = n;//还未覆盖到的字母总数vector<int> tmp(cnt1);//复制一下cnt1,动态维护一下窗口内还需要覆盖的各个字母的个数vector<int> cnt2(128, 0);//维护窗口内所有元素出现的次数for (int i = 0; i < m; i++) {char tar = s[i];//待扩充进来的字符r++;//扩充右边界cnt2[tar]++;//更新窗口内元素出现次数//扩充进来的字母是有效的覆盖,解释看上面的注意部分if (visit1[tar] == true && tmp[tar] != 0) {sum--;//要覆盖的总数-1tmp[tar]--;//窗口内该字母还需要出现的次数-1}//开始判断是否要缩减窗口if (sum == 0) {//刚刚好,窗口扩展到全覆盖时候,才开始动左指针,找到当前状态下最小//当前窗口完全可以覆盖,为了找最小,我们收缩左边界,直到恰好覆盖(即再缩就不可以覆盖为止)//这时候,就是当前状态下最小while (sum == 0) {//连续缩小char tar2 = s[l];//待排除的元素if (visit1[tar2] == true) {//被扔出去的字母是有效字母,反之直接扔即可(l++)cnt2[tar2]--;//动态维护窗口内各字母个数,有效字母被扔出去后,它的新数量if (cnt2[tar2] < cnt1[tar2]) {//当前窗口不能恰好覆盖目标字母,这个时候就是连续缩窗口的尽头,开始更新动态维护的数据sum++;//窗口内待覆盖的元素+1if (r - l + 1 < mins) {//动态维护最小子串mins = r - l + 1;min_l = l;min_r = r;}tmp[tar2]++;//该字母在窗口内还需出现的次数+1l++;//缩窗口break;//退出连续缩窗口}}l++;}}}return min_l == -1 ? "" : s.substr(min_l, min_r-min_l+1);//始终未找到合适的窗口,min_l==-1,返回空串;反之按照大小裁剪目标串s}
};

力扣424. 替换后的最长重复字符

题目链接424. 替换后的最长重复字符
在这里插入图片描述

思路

明显的,在大区间中,找一个连续的小区间,经过不多于k次的变化之后,让其中元素都统一,且这个片段要最长。区间搜索,马上想滑窗,上模板:

1、初始化 l=0 ;r=-1 ;统计窗口内各个元素个数;一个窗口内,为了在有限的替换之后,整体最长,肯定是维护一个个数最多的元素,把和他不同的全换下去,这样才会最长,也能最大程度上利用k,所以维护窗口内最大元素个数
2、r++,扩充窗口,更新元素数量,因为该字母变多了,可能成为最多的个数,所以也要维护窗口内最大元素个数
3、滑窗问题关键来了,缩小窗口:当”非最多数量元素“个数小于等于k(可替换数量),说明这次扩充是可以的,窗口确实可以扩张,不需要收缩(因为题目要的就是最长),反之,就得收缩,更新的数据同上

代码

class Solution {
public:int characterReplacement(string s, int k) {int n = s.size();vector<int> cnt(26, 0);//窗口各个字母个数int l = 0, r = -1;int maxs = 0;for (int i = 0; i < n; i++) {char tar = s[i];//待扩充元素r++;//扩充cnt[tar - 'A']++;//两次更新数据maxs = max(maxs, cnt[tar - 'A']);if (r - l + 1 - maxs > k) {//扩充失败了,必须要收缩一下char tmp = s[l];cnt[tmp - 'A']--;for (int j = 0; j < 26; j++) {maxs = max(maxs, cnt[j]);}l++;}}return r - l + 1;}
};

相关文章:

春招Leetcode刷题日记-D4-双指针算法-滑动窗口快慢指针

D4-双指针算法-滑动窗口&&快慢指针快慢指针算力扣141. 环形链表思路代码力扣142. 环形链表 II思路代码滑动窗口力扣76. 最小覆盖子串思路代码力扣424. 替换后的最长重复字符思路代码快慢指针算 快慢指针算法&#xff0c;多用于链表当中&#xff0c;常见的如&#xff1…...

【go】结合一个go开源项目分析谷歌浏览器cookie为什么不安全 附go项目导包失败怎么解决教程

本文创作背景 源于谷歌浏览器提示密码被泄露 并且某站很快收到了异地企图登录的提醒。 当即怀疑是不是谷歌浏览器保存的密码不安全&#xff0c;最后查阅诸多资料 并找到一个go语言编写的开源项目进行研究&#xff0c;虽然最终不能确定密码是如何泄露的 但研究结论还是让人不由感…...

Windows瘦身方法

一、快速删除系统盘临时文件方法, 1、winr打开运行对话框&#xff0c;输入%temp%命令&#xff0c;如图1 图1 2、打开temp文件夹&#xff0c;如图2&#xff0c;选择所有文件&#xff0c;鼠标右键删除或按Del键删除。 图2 二、磁盘清理 1、winr&#xff0c;输入cleanmgr&#x…...

19. 删除链表的倒数第 N 个结点

题目链接&#xff1a;https://leetcode.cn/problems/remove-nth-node-from-end-of-list/进阶&#xff1a;你能尝试使用一趟扫描实现吗&#xff1f;解题思路&#xff1a;最简单的方法是先遍历一次链表&#xff0c;得到链表的长度len&#xff0c;然后再一次遍历链表&#xff0c;遍…...

【Linux】网络编程 - 基础概念

目录 一.OSI七层模型vsTCP/IP五层模型 1.一些周边概念 2.OSI七层模型 3.TCP/IP五层模型 4.网络传输流程图 二.什么是MAC地址 三.什么是IP/IP地址 1.什么是IP 2.什么是IP地址 四.什么是端口号 一.OSI七层模型vsTCP/IP五层模型 1.一些周边概念 局域网vs广域网 网络互…...

Unity 多语言 轻量高效的多语言工具集 LanguageManager

效果展示 支持excel导入自动化 组件化 更方便 也提供直接获取多语言的接口 没有挂 LanguageText的对象也可以获取多语言文本内容 支持 Format接口 可以传递N个参数进来组装多语言 支持首次系统语言自测 支持语言切换后本地自动保存配置 支持实时切换 同步刷新所有UI 容错处…...

在Linux和Windows上安装zookeeper-3.5.9

记录&#xff1a;378场景&#xff1a;在CentOS 7.9操作系统上&#xff0c;安装zookeeper-3.5.9。在Windows上操作系统上&#xff0c;安装zookeeper-3.5.9。版本&#xff1a;JDK 1.8 CentOS 7.9 zookeeper-3.5.9官网地址&#xff1a;https://zookeeper.apache.org/源码地址&…...

【ESP32+freeRTOS学习笔记-(八)资源管理】

目录1、 资源使用概况2、互斥方法之一&#xff1a;基本临界区2.1、taskENTER_CRITICAL_FROM_ISR() 和taskEXIT_CRITICAL_FROM_ISR()3、互斥方法之二&#xff1a;挂起或锁定调度程序3.1 vTaskSuspendAll()3.2 xTaskResumeAll()4 互斥方法三&#xff1a;互斥信号量&#xff08;和…...

P1427 小鱼的数字游戏(赋值运算符和String)

小鱼的数字游戏 题目描述 小鱼最近被要求参加一个数字游戏&#xff0c;要求它把看到的一串数字 aia_iai​&#xff08;长度不一定&#xff0c;以 000 结束&#xff09;&#xff0c;记住了然后反着念出来&#xff08;表示结束的数字 000 就不要念出来了&#xff09;。这对小鱼…...

Java学的好,工作不愁找

俗话说的好&#xff1a;“Java学的好&#xff0c;工作不愁找”&#xff0c;不管我们学习哪一门语言&#xff0c;我们都要掌握从抽象化中提取出来的方法&#xff0c;这样你才能提高我们的学习能力&#xff0c;并且在学习新事物的时候可以提取我们自己的想法。学习java&#xff0…...

表情包可视化编辑、生成配置信息数据工具

合成GIF图片 - 表情包 后续&#xff0c;用于快速、便捷生成 img_config.js 中 要生成的GIF每一帧数据&#xff08;写入头像图片信息参数&#xff09;&#xff1b; 1、先上传 写入GIF中头像 标准图&#xff0c;同时获取图片信息&#xff0c;更新 写入GIF中头像 初始值&#xff0…...

java简单循环结构

while循环结构 Java提供的while条件循环。它的基本用法是&#xff1a; while (条件表达式) {循环语句 } // 继续执行后续代码while循环在每次循环开始前&#xff0c;首先判断条件是否成立。如果计算结果为true&#xff0c;就把循环体内的语句执行一遍&#xff0c;如果计算结果…...

【Servlet+Jsp+Mybatis+Maven】WEB图书馆管理系统

web图书馆管理系统一、绪论二、流程和其页面展示效果流程页面效果项目结构三、具体实现第一步&#xff1a;备数据库表第二步&#xff1a;编写登录前端代码第三步&#xff1a;利用过滤器处理安全问题第四步&#xff1a;控制层去实现相关调用第五步&#xff1a;实现持久化层与数据…...

【WPF】WindowChrome 自定义窗口完美实现

WindowChrome 自定义窗口完美实现简介效果图自定义最小化、最大化、关闭按钮布局实现结语简介 Microsoft官网关于 WindowChome 的介绍 截取Microsoft文章的一段话&#xff1a;   若要在保留其标准功能时自定义窗口&#xff0c;可以使用该 WindowChrome 类。 该 WindowChrome…...

Python客户端使用SASL_SSL连接Kafka需要将jks密钥转换为pem密钥,需要转化成p12格式再转换pem才能适配confluent_kafka包

证书生成 生成证书以及jks参考以下文章 https://blog.csdn.net/qq_41527073/article/details/121148600 证书转换jks -> pem 需要转化成p12以下转换才能适配confluent_kafka包&#xff0c;直接jks转pem会报错不能使用&#xff0c;具体参考以下文章 https://www.ngui.cc/z…...

JDK8 ConcurrentHashMap源码分析

文章目录常量说明put() 方法putVal() 方法initTable()&#xff1a;初始化数组treeifyBin()&#xff1a;链表转红黑树tryPresize()&#xff1a;初始化数组扩容TreeBin() 构造方法&#xff1a;生成红黑树putTreeVal()&#xff1a;往红黑树中插入值helpTransfer()&#xff1a;多线…...

前置知识-初值问题、欧拉法、改进欧拉法

1.1 初值问题 初值问题是科研、工程技术应用中最常见的一类问题, 一阶常微分方程的初值问题表述如下: 已知 u ( x ) u(x) u(x) 的起始点 ( x 0 , u 0 ) \left(x_0, u_0\right)...

睡眠影响寿命,这几个睡眠习惯赶紧改掉!

我们知道&#xff0c;现在睡眠不足已经成为普遍问题&#xff0c;但你知道睡眠的时长会影响寿命吗&#xff1f;熬夜对身体不好&#xff0c;已是老生常谈。但睡得过早&#xff0c;也可能影响寿命&#xff01;2021年《睡眠医学》杂志一项针对21个国家11万名参与者的研究中发现&…...

Linux逻辑卷管理器(PV、VG、LV、PE)

目录 PV阶段 VG阶段 LV阶段 文件系统阶段 逆向操作&#xff08;删除LVM&#xff09; 逻辑卷管理器&#xff08;Logical Volume Manager&#xff09;&#xff0c;简称LVM LVM的做法是将几个物理的分区&#xff08;或磁盘&#xff09;通过软件组合成为一块看起来时独立的大…...

Centos7 内核升级

一、背景 在 CentOS 使用过程中&#xff0c;高版本的应用环境可能需要更高版本的内核才能支持&#xff0c;所以难免需要升级内核&#xff0c;所以下面将介绍yum和rpm两种升级内核方式。 关于内核种类: kernel-ml——kernel-ml 中的ml是英文【 mainline stable 】的缩写&…...

SpringBoot 启动配置文件加载和参数配置修改问题

SpringBoot 配置文件修正和参数覆盖SpringBoot 配置文件加载和参数覆盖1、SpringBoot 配置文件加载1.1、修改application.properties的参数几种方式1.2、方法一&#xff1a;直接CMD1.3、方法二&#xff1a;系统变量配置1.4、方法三&#xff1a;程序运行配置1.5、方法四&#xf…...

布隆过滤器和布谷鸟过滤器详解

今天和大家分享下布隆过滤器和布谷鸟过滤器 一.布隆过滤器 1.简单介绍 布隆过滤器是用于检索一个元素是否在一个集合中的算法&#xff0c;是一种用空间换时间的查询算法。 2.实现原理 布隆过滤器的存储结构是一个bitmap结构&#xff0c;初始值都是0&#xff0c;如下图所示&am…...

WebGIS前端框架(openlayers,mapbox,leaflet)图形图像底层渲染原理分析

学了这么多的框架,做了这么多的项目,你是否清楚你使用的GIS框架(mapbox,open layers,cesium,leaflet)底层到底是什么原理?是否清楚哪些所谓的地图影像,矢量图形,图标,图像动画等是如何渲染到网页上的?这篇文章就大家解读一下WebGIS的底层原理。 首先说说历史,有时…...

AcWing语法基础课笔记 第五章 C++中的字符串

第五章 C中的字符串 字符串是计算机与人类沟通的重要手段。 ——闫学灿 字符与整数的联系——ASCII码 每个常用字符都对应一个-128~127的数字&#xff0c;二者之间可以相互转化&#xff1a; 常用ASCII值&#xff1a;’A’-‘Z’ 是65~90&#xff0c;’a’-‘z’…...

抓包工具Charles(一)-下载安装与设置

无论是在测试、开发工作中&#xff0c;抓包都是很重要、很常用的技能。Charles作为一款抓包工具&#xff0c;能够满足大部分的工作需求。 文章目录一、下载地址二、安装三、安装根证书&#xff08;电脑&#xff09;四、设置五、抓包附录&#xff1a;[零基础入门接口功能测试教程…...

SpringBoot09:Swagger

什么是Swagger&#xff1f; ①是一个API框架 ②可以在线自动生成 RestFul 风格的API文档&#xff0c;实现API文档和API定义同步更新 ③可以直接运行、在线测试 API 接口 ④支持多种语言&#xff08;Java、PHP等&#xff09; 官网&#xff1a;API Documentation & Desi…...

Git 常用命令

笔记-git命令1、名词2、基本操作3、分支操作1、名词 master: 默认开发分支origin: 默认远程版本库Index / Stage: 暂存区Workspace: 工作区Repository: 仓库区 &#xff08;或本地仓库&#xff09;Remote: 远程仓库 2、基本操作 配置级别 -local (默认&#xff0c;高级优先…...

查看jdk安装路径,在windows上实现多个java jdk的共存解决办法,安装java19后终端乱码的解决

查看jdk安装路径&#xff0c; 在windows上实现多个java jdk的共存解决办法&#xff0c; 安装java19后终端乱码的解决 目录 一、查看jdk&#xff08;java开发工具包&#xff09;安装路径的方法 二、在windows上实现多个java jdk的共存 &#xff08;1&#xff09;、安装好多…...

链表数据结构

用途&#xff1a; 链表是一种用于计算机中存储与组织数据的结构&#xff0c;链表将数据以节点的形式串联起来&#xff0c;其存储的容量大小可以动态伸缩。 结构&#xff1a; typedef struct {int data; /*当前节点的数据*/node *next;/*下一个节点的指针*/node *last;/*上一个…...

汽车DTC故障内码与标准故障码的解析与转换

目录 一、故障内码与标准故障码的解析 &#xff08;1&#xff09;故障内码的信息格式与解析 &#xff08;2&#xff09;故障内码中DTC状态的解析 &#xff08;3&#xff09;故障内码与标准故障码之间的对应关系 二、故障内码与标准故障码的转换代码 一、故障内码与标准故障…...

网站维护是什么意思/营销方案推广

文章目录1.STL1.1 什么是STL1.2 STL六大基本组件1.3为什么要学习STL1.4STL的缺陷2.什么是string类2.1为什么学习2.2了解string类3.string成员函数3.1 string构造函数3.2string类对象容器(数据结构)操作4.string类对象的访问和遍历5.string类对象的修改操作6.string类非成员函数…...

drupal 网站实例/上海百度竞价托管

卡布列克数(Kaprekar number)是具有以下性质的数&#xff1a;对于某个正整数X {\displaystyle X}在n进位下存在正整数 A, B 及 m&#xff0c;且0 < B < b n {\displaystyle 0X 2 A n m B {\displaystyle X^{2}An^{m}B}X A B {\displaystyle XAB}简单的说&#xff0c;…...

开源网站搭建/怎么开网站

1. 写在前面 今天开始&#xff0c;想开启大数据框架学习的一个新系列&#xff0c;之前在学校的时候就会大数据相关技术很是好奇&#xff0c;但苦于没有实践场景&#xff0c;对这些东西并没有什么体会&#xff0c;到公司之后&#xff0c;我越发觉得大数据的相关知识很重要&…...

国外做vj的网站/永州网络推广

前言&#xff1a; 视觉小车最重要的是视觉功能&#xff0c;其实现方式主要有&#xff1a; Opencv外置计算机摄像头。需要计算机作为上位机。Stm32OV7670。较难&#xff0c;大师级。OpenMV摄像头。较简单&#xff0c;入门级。 博主刚开始为了准备项目&#xff0c;了解尝试过前…...

绍兴网站建设哪家好/平台广告推广

返璞归真这几天项目有一个linux下部署数据库的操作&#xff0c;数据库使用python进行初始化安装。然后问题来了&#xff0c;由于linux服务器涉及安全要求&#xff0c;除了代码以来的Python3.6版本外不允许安装其他插件与工具&#xff0c;不巧的是python的代码报错了…如果放在平…...

网站建设服务器篇/教育培训班

String的hashcode()方法 public int hashCode() {int h hash;if (h 0 && value.length > 0) {char val[] value;for (int i 0; i < value.length; i) {h 31 * h val[i];}hash h;}return h;}​ 选择31是因为可以用移位和减法运算来代替乘法&#xff0c;从而…...