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

环形链表系列导学

问题描述

给定一个单链表,可能存在一个环。我们的目标是找到环的入口节点,即从这个节点开始,链表进入循环。如果没有环,则返回 null

将链表问题转化为数学问题

状态序列与循环

我们可以将链表节点视为状态,每个节点的 next 指针代表状态转移函数 f f f。从头节点开始,我们可以得到一个状态序列:

  • x 0 , x 1 = f ( x 0 ) , x 2 = f ( x 1 ) , x 3 = f ( x 2 ) , … x_0, x_1 = f(x_0), x_2 = f(x_1), x_3 = f(x_2), \ldots x0,x1=f(x0),x2=f(x1),x3=f(x2),

如果链表中存在环,那么这个序列将出现循环

寻找循环起点

我们的目标是找到状态序列中最小的 μ \mu μ,使得对于某个最小的 λ \lambda λ,满足:

  • x μ = x μ + λ x_{\mu} = x_{\mu + \lambda} xμ=xμ+λ

其中:

  • μ \mu μ循环的起始位置(环的入口)
  • λ \lambda λ循环节的长度(环的长度)

Floyd 判圈算法的数学原理

阶段一:检测循环

使用两个指针:

  • 慢指针(slow):每次移动一步
  • 快指针(fast):每次移动两步

阶段二:找到循环的起始位置

数学推导

设:

  • 非环部分长度 a a a
  • 环的长度 b b b
  • 从环入口到相遇点的距离 c c c
  • 快指针在环内绕行的圈数 k k k ( k ≥ 1 k \geq 1 k1)
距离关系
  • 慢指针走的总距离
    D slow = a + c D_{\text{slow}} = a + c Dslow=a+c

  • 快指针走的总距离
    D fast = a + c + k × b D_{\text{fast}} = a + c + k \times b Dfast=a+c+k×b

  • 由于快指针速度是慢指针的两倍:
    D fast = 2 × D slow D_{\text{fast}} = 2 \times D_{\text{slow}} Dfast=2×Dslow

推导步骤
  1. 建立等式
    a + c + k × b = 2 × ( a + c ) a + c + k \times b = 2 \times (a + c) a+c+k×b=2×(a+c)

  2. 化简
    a + c + k × b = 2 a + 2 c a + c + k \times b = 2a + 2c a+c+k×b=2a+2c
    k × b = 2 a + 2 c − a − c k \times b = 2a + 2c - a - c k×b=2a+2cac
    k × b = a + c k \times b = a + c k×b=a+c

  3. 得出关系式
    a + c = k × b a + c = k \times b a+c=k×b

寻找环的入口
  • 快指针走了 a a a 步到达环入口
  • 慢指针从相遇点再走 b − c b - c bc 步也到达环入口

因为:
b − c = b − ( k × b − a ) = − ( k − 1 ) × b + a b - c = b - (k \times b - a) = - (k - 1) \times b + a bc=b(k×ba)=(k1)×b+a

具体例子

假设:

  • 非环部分长度 a = 3 a = 3 a=3
  • 环的长度 b = 4 b = 4 b=4
  • 快指针在环内绕行的圈数 k = 1 k = 1 k=1

根据推导:
a + c = k × b ⟹ c = k × b − a = 1 × 4 − 3 = 1 a + c = k \times b \implies c = k \times b - a = 1 \times 4 - 3 = 1 a+c=k×bc=k×ba=1×43=1

  • 慢指针走的总距离
    D slow = a + c = 3 + 1 = 4 D_{\text{slow}} = a + c = 3 + 1 = 4 Dslow=a+c=3+1=4

  • 快指针走的总距离
    D fast = 2 × D slow = 8 D_{\text{fast}} = 2 \times D_{\text{slow}} = 8 Dfast=2×Dslow=8

验证快指针的距离:
D fast = a + c + k × b = 3 + 1 + 1 × 4 = 8 D_{\text{fast}} = a + c + k \times b = 3 + 1 + 1 \times 4 = 8 Dfast=a+c+k×b=3+1+1×4=8

相关文章:

环形链表系列导学

问题描述 给定一个单链表,可能存在一个环。我们的目标是找到环的入口节点,即从这个节点开始,链表进入循环。如果没有环,则返回 null。 将链表问题转化为数学问题 状态序列与循环 我们可以将链表节点视为状态,每个节点的 next 指针代表状态转移函数 f f f。从头节点开始,我…...

IDEA2024创建一个spingboot项目

以下是创建一个基本的 Spring Boot 项目的步骤和示例: 初始化一个springboot工程其实有许多方法,笔者这里挑了一个最快捷的方式搭建一个项目。我们直接通过官方平台(start.spring.io)进行配置,然后下载压缩包就可以获取…...

Nginx:ssl

目录 部署ssl前提 nginx部署ssl证书 部署ssl部署建议 部署ssl前提 网站有域名根据域名申请到ssl证书,并下载证书部署到nginx中 部署了ssl证书后,访问的流量是加密的。 nginx部署ssl证书 #80端口跳转到443 server {listen 80;return 302 https://1…...

QT配置文件详解

TEMPLATElib TEMPLATE变量用于指定项目模板类型,其值可以是以下几种: app:建立一个应用程序的makefile,这是默认值。lib:建立一个库的makefile。vcapp:建立一个应用程序的Visual Studio项目文件。vclib&a…...

根据合约地址判断合约协议的方法

判断合约协议之前,需要了解一下什么是ERC165协议: ERC165 是以太坊中用于标准化接口检测的协议,由 Fabian Vogelsteller 在 2018 年创建 ,其核心内容主要包括以下方面: 接口定义 单一函数接口:ERC165 协议…...

联想YOGA Pro 14s至尊版电脑找不到独立显卡(N卡)问题,也无法安装驱动的问题

问题描述 电脑是联想YOGA Pro 14s至尊版,电脑上装的独立显卡是4060,一直是能够使用独立显卡的。然而有两次突然就找不到显卡了,NVIDIA CONTROL PANEL也消失了,而且也无法安装驱动。具体表现如下: 无法连接外接显示器…...

Spring Web开发注解和请求(1)

大家好我是小帅,今天我们来学习Spring Web MVC框架(入门级) 文章目录 1. 什么是 Spring Web MVC?1.1 MVC 定义1.2 什么是Spring MVC ? 2. 学习Spring MVC2.1 建⽴连接第一个spring MVC程序 3. web开发注解的解释3.1RestControlle…...

Supervisor使用教程

文章目录 [toc] Supervisor使用教程平台要求 安装supervisor本文测试的时候是使用Linux的yum安装的(其它方式未做测试)加入系统守护进行 Supervisor使用教程 在项目中,经常有脚本需要常驻运行的需求。以PHP脚本为例,最简单的方式…...

Spark基本命令详解

文章目录 Spark基本命令详解一、引言二、Spark Core 基本命令1、Transformations(转换操作)1.1、groupBy(func)1.2、filter(func) 2、Actions(动作操作)2.1、distinct([numTasks])2.2、sortBy(func, [ascending], [numTasks]) 三、…...

Three.js 相机视角的平滑过渡与点击模型切换视角

在 Three.js 中,实现相机视角的平滑过渡和点击模型切换到查看模型视角是一个常见且有用的功能。这种效果不仅能提升用户体验,还能为场景互动添加更多的动态元素。 1. 基本设置 首先,我们需要创建一个基本的 Three.js 场景,包括相…...

jenken 打包linux包遇到的问题(环境变量)

环境变量问题 我们jenkens 打包的时候 远程打包 通过ssh 去在服务器上调用脚本 环境变量没有去自动加载 代码打包的时候总是提示相关的so文件找不到 解决方案在 相关程序的make之前 把环境变量加在前面 我这里直接将变量加载代码的最前面...

使用 Go 语言中的 Context 取消协程执行

使用 Go 语言中的 Context 取消协程执行 在 Go 语言中,协程(goroutine)是一种轻量级的线程,非常适合处理并发任务。然而,如何优雅地取消正在运行的协程是一个常见的问题。本文将通过一个具体的例子来展示如何使用 con…...

python图像彩色数字化

效果展示&#xff1a; 目录结构&#xff1a; alphabets.py GENERAL {"simple": "%#*-:. ","complex": "$B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_~<>i!lI;:,\"^. " } # Full list could be found here…...

cesium 3dtile ClippingPlanes 多边形挖洞ClippingPlaneCollection

原理就是3dtiles里面的属性clippingPlanes 采用ClippingPlaneCollection&#xff0c;构成多边形来挖洞。 其次就是xyz法向量挖洞 clippingPlanes: new this.ffCesium.Cesium.ClippingPlaneCollection({unionClippingRegions: true, // true 表示多个切割面能合并为一个有效的…...

docker 僵尸进程问题

docker僵尸进程 子进程结束后&#xff0c;父进程没有回收该进程资源&#xff08;父进程可能没有wait&#xff09;&#xff0c;子进程残留资源存放与内核中&#xff0c;就变为僵尸进程(zombie) 场景分析&#xff1a;python脚本A中执行B应用&#xff0c;将A部署在docker中&#…...

微软要求 Windows Insider 用户试用备受争议的召回功能

拥有搭载 Qualcomm Snapdragon 处理器的 Copilot PC 的 Windows Insider 计划参与者现在可以试用 Recall&#xff0c;这是一项臭名昭著的快照拍摄 AI 功能&#xff0c;在今年早些时候推出时受到了很多批评。 Windows 营销高级总监 Melissa Grant 上周表示&#xff1a;“我们听…...

husky,commit规范,生成CHANGELOG.md,npm发版

项目git提交工程化&#xff08;钩子&#xff0c;提交信息commit message&#xff09;&#xff0c;npm修改版本&#xff0c;需要涉及到的包&#xff1a; husky&#xff0c;允许在git钩子中执行不同的脚步&#xff0c;如commitlint&#xff0c;eslint&#xff0c;prettier&#…...

DETR:一种新颖的端到端目标检测与分割框架

DETR&#xff1a;一种新颖的端到端目标检测与分割框架 摘要&#xff1a; 随着深度学习技术的发展&#xff0c;目标检测和图像分割任务取得了显著的进步。然而&#xff0c;传统的基于区域提名的方法在处理这些问题时存在一定的局限性。为此&#xff0c;Facebook AI Research&am…...

前端js面试知识点思维导图(脑图)

如果看着不清晰可以去https://download.csdn.net/download/m0_73761441/90058523访问下载&#xff0c;无需积分 使用百度脑图制作&#xff0c;可以一键导入下面的文本生成自己的脑图 js相关面试题、知识点 数据类型 1. 数据类型分类&#xff1f;分别包含&#xff…...

【Java基础入门篇】一、变量、数据类型和运算符

Java基础入门篇 一、变量、数据类型和运算符 1.1 变量 计算机中的数据表示方式是&#xff1a;“二进制(0/1)”&#xff0c;但是同时也可以兼容其他进制&#xff0c;例如八进制、十进制、十六进制等。 Java变量的本质是&#xff1a;存储在固定空间的内容&#xff0c;变量名是…...

【llamafactory】安装与环境配置

拉取镜像 git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git cd LLaMA-Factory创建虚拟环境 conda create -n llamafactory python3.10 conda activate llamafactory安装所需依赖 pip install -e ".[torch,vllm,optimum,auto_gptq]"...

Vue 3 + Vuex 埋点实现指南

在现代前端开发中&#xff0c;数据分析和用户行为追踪是不可或缺的部分。本文将介绍如何在 Vue 3 项目中实现埋点功能&#xff0c;具体使用 Vuex 进行状态管理&#xff0c;并通过自定义 Hook 实现埋点逻辑。 目录 项目结构实现埋点逻辑使用埋点功能总结 1.项目结构 我们将创…...

电子应用设计方案-30:智能扫地机器人系统方案设计

智能扫地机器人系统方案设计 一、引言 随着人们生活节奏的加快和对生活品质的追求&#xff0c;智能家居产品越来越受到消费者的青睐。智能扫地机器人作为一种能够自动清扫地面的智能设备&#xff0c;为人们节省了大量的时间和精力。本方案旨在设计一款功能强大、智能化程度高、…...

HTML飞舞的爱心(完整代码)

写在前面 HTML语言实现飞舞的爱心完整代码。 完整代码 <!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8"><title>飞舞爱心</title><style>* {margin: 0;padding: 0;}html,body {overflow: hidd…...

android shader gl_Position是几个分量

在Android的OpenGL ES中&#xff0c;gl_Position是顶点着色器&#xff08;Vertex Shader&#xff09;的一个内置输出变量&#xff0c;它用于指定顶点在裁剪空间&#xff08;Clip Space&#xff09;中的位置。gl_Position是一个四维向量&#xff08;4-component vector&#xff…...

spine 动画层 动态权重

前奏.业务背景 这边想实现一个功能&#xff0c;项目中有 一只猫 猫的头会盯着逗猫棒移动。因为素材还没到所以这里使用了 spine 自带的猫头鹰。他的动画 刚好挺有针对性&#xff1a;&#xff08;关联上篇&#xff09;https://blog.csdn.net/nicepainkiller/article/details/144…...

《Python基础》之Python中可以转换成json数据类型的数据

目录 一、JSON简介 JSON有两种基本结构 1、对象&#xff08;Object&#xff09; 2、数组&#xff08;Array&#xff09; 二、将数据装换成json数据类型方法 三、在Python中&#xff0c;以下数据类型可以直接转换为JSON数据类型 1、字典&#xff08;Dictionary&#xff09…...

在oracle下载jdk显示400 Bad Request Request Header Or Cookie Too Large

下载JDK17&#xff0c;官网地址&#xff1a;【https://www.oracle.com/cn/java/technologies/downloads/#jdk17-windows】 问题&#xff1a; 出现 400 Bad Request: Request Header Or Cookie Too Large 错误&#xff0c;通常是由于浏览器存储的 Cookies 或请求头过大所导致的…...

MongoDB注入攻击测试与防御技术深度解析

MongoDB注入攻击测试与防御技术深度解析 随着NoSQL数据库的兴起&#xff0c;MongoDB作为其中的佼佼者&#xff0c;因其灵活的数据模型和强大的查询能力&#xff0c;受到了众多开发者的青睐。然而&#xff0c;与任何技术一样&#xff0c;MongoDB也面临着安全威胁&#xff0c;其…...

【Java基础入门篇】前言

Java基础入门篇 本系列内容主要针对Java基础知识&#xff0c;总共包含四大部分内容&#xff1a; 变量、数据类型和运算符控制语句和递归算法面向对象和JVM底层分析数组和排序 学习需要具备&#xff1a; IDEA编译器 JDK1.8版本 写在前面 在Java入门的最开始&#xff0c;我们需…...

营销网站建设评估及分析/百度网址大全首页链接

目录 1.视图对象 1.1创建视图 1)简单视图 2&#xff09;建立只读视图 3&#xff09;复杂视图 1.2管理视图 1&#xff09;查看视图定义 2&#xff09;修改视图定义 3&#xff09;重新编译视图 4&#xff09;删除视图 2.索引 2.1索引概述 2.2创建索引 1&#xff09…...

四川城乡建设部网站首页/全球网络营销公司排行榜

删除文件&#xff1a;del &#xff08;deldelete 命令erase与del一样的效果.&#xff09; D:\>del /?删除一个或数个文件。DEL [/P] [/F] [/S] [/Q] [/A[[:]attributes]] namesERASE [/P] [/F] [/S] [/Q] [/A[[:]attributes]] names names 指定一个或数个文件或目…...

有阿里云服务器 怎么做网站/百度官方网站网址

目录1. FFmpeg解码瓶颈2. 使用libyuv提升解码效率3. 完整代码1. FFmpeg解码瓶颈 经测试发现&#xff0c;FFmpeg解码瓶颈在YUV转RGB上&#xff0c;在12MP视频的环境下&#xff0c;单帧转换时间超过40ms&#xff0c;效率无法满足要求 FFmpeg的YUV转RGB代码&#xff1a; sws_sca…...

做移动网站优化快速排名软件/东莞营销网站建设优化

https://blog.csdn.net/shwan_ma/article/details/78879620 一般来说&#xff0c;打印tensorflow变量的函数有两个&#xff1a;tf.trainable_variables () 和 tf.all_variables()不同的是&#xff1a;tf.trainable_variables () 指的是需要训练的变量tf.all_variables() 指的是…...

做网站多久能排靠前/百度网盘网页版登录首页

使用图像编程这一章来了解一下我们可以使用图片来作些什么事情.一幅图胜过千言万语,在wxWidgets,工具条,树形控件,notebooks,按钮,Html窗口和特定的绘画代码中,都会用到图片.有时候它们还会在不可见的地方发挥作用,比如我们可以用它来创建双缓冲区以避免闪烁.这一章里,我们会接…...

服装网站建设什么公司好/注册城乡规划师教材

一、SELinux安全防护 目标&#xff1a; 本案例要求熟悉SELinux防护机制的开关及策略配置&#xff0c;完成以下任务&#xff1a; 将Linux服务器的SELinux设为enforcing强制模式 在SELinux启用状态下&#xff0c;调整策略打开vsftpd服务的匿名上传访问 从/root目录下移动一…...