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

Floyd 判圈算法(龟兔赛跑算法)

是一种用于检测链表或数组中是否存在环(循环依赖)的高效算法。因其只需要 O(1) 的额外空间,被广泛应用于链表环检测、重复数字查找等问题。

1. 算法核心思想

  • 快指针(Hare):每次移动 两步

  • 慢指针(Tortoise):每次移动 一步

  • 如果存在环,快指针最终会追上慢指针(即两者相遇)。

  • 如果快指针到达终点(如 null),则无环

2. 算法步骤

阶段 1:检测是否有环
  1. 初始化 slow 和 fast 指针,都指向起点(如 head 或 nums[0])。

  2. slow 每次移动 1 步fast 每次移动 2 步

  3. 如果 fast 遇到 null(或数组越界),说明无环。

  4. 如果 slow == fast,说明存在环,进入阶段 2。

阶段 2:找到环的入口(关键)
  1. 重置 slow 到起点,保持 fast 在相遇点。

  2. slow 和 fast 同时每次移动 1 步,直到再次相遇。

  3. 相遇点即为环的入口(即重复数字或链表环的起点)。

两个例题(模板题):

142. 环形链表 II - 力扣(LeetCode)

/*** Definition for singly-linked list.* class ListNode {*     int val;*     ListNode next;*     ListNode(int x) {*         val = x;*         next = null;*     }* }*/
public class Solution {public ListNode detectCycle(ListNode head) {ListNode slow=head;ListNode fast=head;while(fast!=null&&fast.next!=null){slow=slow.next;fast=fast.next.next;if(slow==fast) break;}if(fast==null||fast.next==null) return null;slow=head;while(slow!=fast){slow=slow.next;fast=fast.next;}return slow;}
}

287. 寻找重复数 - 力扣(LeetCode)

eg.

1-0  3-1  4-2  2-3  2-4

0->1->3->2->4->2->4->2->4......,可见,2,4一直循环,存在环。

class Solution {public int findDuplicate(int[] nums) {int slow=nums[0];int fast=nums[0];do{slow=nums[slow];fast=nums[nums[fast]];}while(slow!=fast);slow=nums[0];while(slow!=fast){slow=nums[slow];fast=nums[fast];}return slow;}
}

http://www.lryc.cn/news/621918.html

相关文章:

  • Linux运维新手的修炼手扎之第29天
  • 【网络】IP总结复盘
  • Claude Opus 4.1深度解析:抢先GPT5发布,AI编程之王主动出击?
  • day31 UDP通信
  • Ansible 学习笔记:变量事实管理、任务控制与文件部署
  • 计算机视觉(opencv)实战四——图片阈值处理cv2.threshold()
  • Android RxJava变换操作符详解
  • 从0开始学习Java+AI知识点总结-15.后端web基础(Maven基础)
  • 使用 PyQt5 构建 Python 人脸采集系统实战指南
  • 16进制pcm数据转py波形脚本
  • 来火山引擎「算子广场」,一键处理多模态数据
  • 标题:移动端安全加固:发散创新,筑牢安全防线引言:随着移动互联网
  • OpenCV Python——VSCode编写第一个OpenCV-Python程序 ,图像读取及翻转cv2.flip(上下、左右、上下左右一起翻转)
  • 【数据结构初阶】--排序(三):冒泡排序、快速排序
  • 有红帽认证证书可以0元置换华为openEuler-HCIA/HCIP认证
  • html抽奖功能
  • 【Twincat3】IO的SCAN 不可选中,SCAN中后扫描不到设备
  • langGraph--2--langServe+langGraph示例
  • 高等数学 8.3 平面及其方程
  • 开发Chrome/Edge插件基本流程
  • 使用 Serverless 架构快速构建基于 Iceberg 的事务型实时数据湖
  • redis6的多线程原理
  • 永磁同步电机控制 第一篇、认识电机
  • 图像生成适配器对比与选择:LoRA、ControlNet、T2I-Adapter 与 IP-Adapter
  • UE UDP通信
  • tun/tap 转发性能优化
  • 记录一下 StarRocks 点查的 Profile Metrics
  • C++结构体详解
  • 局部变量与全局变量的关系及应用
  • 【swift开发】SwiftUI概述 SwiftUI 全面解析:苹果生态的声明式 UI 革命