前端算法之双指针之快慢指针(Floyd 判圈法)

  • 双指针与快慢指针
  • 快慢指针(Floyd 判圈法)
    • 简介
    • 推导

在链表中,快指针和慢指针都可以指向头节点,然后根据问题的要求进行移动。

快指针通常会比慢指针移动得更快,例如每次移动两步,而慢指针则每次移动一步。

在数组或字符串中,快指针和慢指针也可以从起始位置开始遍历。

它们可以根据问题的需求以不同的速度移动。

例如,在判断回文性时,快指针可以从末尾开始向前移动,而慢指针则从起始位置开始向后移动。

需要注意的是,具体问题的要求可能会导致快慢指针的起始位置有所不同。

因此,在应用快慢指针算法时,需要根据问题的特点来确定指针的起始位置,并根据算法的要求调整它们的移动规则。

双指针与快慢指针

双指针和快慢指针都是常用的算法技巧,用于处理不同类型的问题。

双指针是指使用两个指针在数据结构中同时遍历或移动

这两个指针可以相向而行,也可以分别位于不同的位置

它们可以按照一定的规则进行移动,解决各种问题。

常见的双指针应用包括:

  1. 对撞指针:指针从数组或字符串的两端同时向中间移动,通常用于查找满足某种条件的元素对、判断回文性等。
  2. 快慢指针:快指针和慢指针以不同的速度遍历数据结构,用于解决链表相关问题,如判断是否有环、查找中间节点等。

快慢指针是双指针的一种特殊情况,在解决链表问题时常用。

快指针每次移动两步,慢指针每次移动一步,通过它们的不同速度,可以实现对链表的特定操作。

例如,

  • 判断链表是否有环时,快慢指针可以同时移动,在存在环的情况下,快指针最终会追上慢指针

  • 在寻找链表的中间节点时,当快指针到达末尾时,慢指针正好在中间节点的位置

总结起来,双指针是一种通用的算法技巧,而快慢指针则是双指针的一种特殊形式,常用于解决链表相关问题。具体使用哪种技巧取决于问题的性质和要求。

快慢指针(Floyd 判圈法)

简介

对于链表找环路的问题,有一个通用的解法——快慢指针(Floyd 判圈法)。

给定两个指针,分别命名为 slow 和 fast,起始位置在链表的开头

每次 fast 前进两步,slow 前进一步。

如果 fast
可以走到尽头,那么说明没有环路;如果 fast 可以无限走下去,那么说明一定有环路,且一定存在某个时刻 slow 和 fast 相遇。

当 slow 和 fast 第一次相遇时,我们将 fast 重新移动到链表开头,并让 slow 和 fast 每次都前进一步。

当 slow 和 fast 第二次相遇时,相遇的节点即为环路的开始点。

更多详细内容,请微信搜索“前端爱好者戳我 查看

推导

注意这个原理中快慢指针起始位置一定要在同一位置,如果慢指针在head,快指针在head->next,二者走的路程就不满足二倍关系

实现代码

head.next 指向下一个值

/**
 * @param {ListNode} head
 * @return {boolean}
 */
var hasCycle = function(head) {
    let fast = slow = head
    while(fast && fast.next){
        fast = fast.next.next
        slow = slow.next
        if(fast === slow){
            return true
        }  
    }
    return false
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux之磁盘分区,挂载

Linux分区 分区介绍 对linux来说无论有几个分区,分给哪个目录使用,归根结底只有一个根目录,linux中每个分区都是用来组成整个文件系统的一部分。linux采用“载入"的处理方法,他的整个文件系统中包含一整套的文件和目录&…

68.乐理基础-打拍子-大附点与变体

上一节内容:66.乐理基础-打拍子-小切分-CSDN博客,只所以没有67因为67可以不用知道,67节内容在:※-打拍子(8)-一拍内的变体1-乐理教程-腾讯课堂 (qq.com) 大附点:大附点这个名字不是通用的&…

如何使用python脚本生成redis格式的数据包

用python脚本生成redis格式的数据包 (1)使用下述网站下载开源的生成gopher协议规则的包的工具 https://github.com/firebroo/sec_tools/tree/master/redis-over-gopher (2)首先要修改redis.cmd中的内容 flushall config set di…

【面试】 Maven 的八大核心概念

Maven 的八大核心概念 在这里,举出这个标题,自然大家知道Maven是干啥的,就不过多进行赘述!我们主要对于Maven的八大核心概念做一个解释补充,这也是我自己的一个学习历程,我们一起共勉! 文章概述…

【网络安全常用术语解读】SCAP详解

本文主要介绍什么是SCAP,SCAP的产生背景是怎样的,SCAP有什么用途,有哪些组件,各个组件的用途是什么? SCAP产生背景 由于计算机和网络技术的快速发展,越来越多的软件和系统被应用到企业和机构中&#xff0c…

一文掌握Java注解之@SpringBootApplication知识文集(1)

🏆作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。 🏆多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。 🎉欢迎 👍点赞✍评论…

编程羔手解决Maven引入多个版本的依赖包,导致包冲突了

最近升级了些依赖发现有个hutool的方法老报错,java.lang.NoSuchMethodError: cn.hutool.core.util.ObjectUtil.defaultIfNull(Ljava/lang/Object;Ljava/util/function/Supplier;) 在 Maven 项目中,当不同的依赖模块引入 Hutool 的不同版本时&#xff0c…

软件测试/测试开发丨学习笔记之 Python 函数

python 函数 函数的作用 函数是组织好的,可重复使用的,用来实现单一或相关联功能的代码段函数能提高应用的模块性和代码的重复利用率python 内置函数:docs.python.org/zh-cn/3.8/l… 函数定义 def:函数定义关键词function_nam…

【赠书第15期】案例学Python(基础篇)

文章目录 前言 1 简介 2 功能列表 3 实现 3.1 学生类 3.2 学生管理系统类 3.3 使用示例 4 推荐图书 5 粉丝福利 前言 当涉及案例学 Python 时,可以选择一个具体的问题或场景,通过编写代码来解决或模拟这个问题。以下是一个例子,通过…

Python绘制高级图表(1):绘制条形统计图

一、初始化 1. 引入库,设置画笔 from turtle import * t Turtle() t.color("black") t.width(3)2. 为了美观,画出xy轴 (1) 普通型 from turtle import * t Turtle() t.color("black") t.width(3)# 以画布为600 * 600为例 # 1.…

005、数据类型

1. 关于数据类型 Rust中,每个值都有其特定的数据类型,Rust会根据数据的类型来决定如何处理它们。 Rust是一门静态类型语言,它在编译程序的过程中就需要知道所有变量的具体类型。在大部分情况下,编译器可以根据我们如何绑定、使用变…

vue3(十一)-基础入门之脚手架创建项目与打包并部署项目

一、安装 node.js node.js官网 1、下载并安装推荐版 2、检查是否安装成功 有版本号表示安装成功 3、如果想安装淘宝镜像可以使用以下指令 npm install -g cnpm -registryhttps://registry.npm.taobao.org检查淘宝镜像是否安装成功 二、安装vue脚手架 该指令为固定指令不可…

『亚马逊云科技产品测评』活动征文|云服务器如何快速搭建个人博客(图文详解)

授权声明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 Developer Centre, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道 文章目录 引言一、前期准备步骤1.1 准备一个亚马逊 EC2 服务器1.2 进入控…

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK设置相机的固定帧率(C++)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK设置相机的固定帧率(C) Baumer工业相机Baumer工业相机的固定帧率功能的技术背景CameraExplorer如何查看相机固定帧率功能在NEOAPI SDK里通过函数设置相机固定帧率 Baumer工业相机通过NEOAPI SDK设置相机固定…

ARCGIS PRO SDK 访问Geometry对象

一、Geometry常用对象 二、主要类 1、ReadOnlyPartCollection:Polyline 和 Polygon 使用的 ReadOnlySegmentCollection 部件的只读集合,属性成员:​ 名字描述Count获取 ICollection 中包含的元素数。TIEM获取位于指定索引处的元素。Spatial…

CCNP课程实验-Route_Path_Control_CFG

目录 实验条件网络拓朴需求 配置实现基础配置需求实现1.A---F所有区用Loopback模拟,地址格式为:XX.XX.XX.XX/32,其中X为路由器编号。根据拓扑宣告进对应协议。A1和A2区为特例,A1:55.55.55.0/24,A2&#xff…

【Vue2+3入门到实战】(16)VUEVue路由的重定向、404、编程式导航、path路径跳转传参 详细代码示例

目录 一、Vue路由-重定向1.问题2.解决方案3.语法4.代码演示 二、Vue路由-4041.作用2.位置3.语法4.代码示例 三、Vue路由-模式设置1.问题2.语法 四、编程式导航-两种路由跳转方式1.问题2.方案3.语法4.path路径跳转语法5.代码演示 path跳转方式6.name命名路由跳转7.代码演示通过n…

C++day4作业

定义一个Person类,私有成员int age,string &name,定义一个Stu类,包含私有成员double *score,写出两个类的构造函数、析构函数、拷贝构造和拷贝赋值函数,完成对Person的运算符重载(算术运算符、条件运算…

利用idea+ jclasslib插件查看和分析 Java 类文件的字节码

jclasslib介绍 jclasslib 插件是一个用于 IntelliJ IDEA 的工具,它允许开发者在集成开发环境(IDE)内直接查看和分析 Java 类文件的字节码。这个插件尤其对于想要深入了解 Java 字节码、类加载机制、以及 Java 虚拟机(JVM&#xf…

第4课 FFmpeg读取本地mp4文件并显示

在上节课,我们使用FFmpeg实现了一个最简单的rtmp播放器,它看起来工作正常。这节课,我们尝试让它来播放本地的mp4文件试试。 1.将原rtmp地址修改为本地mp4地址: const char *inFileName "d:\\mp4\\dtz.mp4"; 调试运…