Floyd判断环算法

全名Floyd’s cycle detection Algorithm, 又叫龟兔赛跑算法(Floyd's Tortoise and Hare),常用于链表、数组转化成链表的题目中。

情景介绍

我们将设置两个指针:slow和fast。slow一次走一格,fast一次走两格。

p :环之前的距离

m:S和Q之间的步数

A:链表起点

S:循环起点

Q:初次相遇点

L :环的长度

k :环数

判断是否有环

若在某一时刻slow和fast相遇,则存在环(又可叫Two Pointers 方法)

[1] slow_step = p + L * k1 + m;

[2] fast_step = 2 * slow_step = p + L * k2 + m;

[2] - [1] = [1] = L * (k2 - k1) 由此可知slow走过的步数是L的倍数 => p + m是L的倍数

找循环起点S

fast从Q继续走,slow从A重走,当二者再次相遇,此时slow必然刚好走到循环起点S,fast也必然走到循环起点S。

证明:

slow_step = p

fast_step = L - m + L * k3

fast_step - slow_step = L - m - p + L * k3= L * k4 (因为 p + m 是L的倍数)

计算循环长度L

[1]当slow和fast初次相遇后

标记相遇的值,new一个新指针重新绕环走,计算走过的步数,当再次到达相遇值,走过的步数即为L。

[2]找到S后

进入循环,当再次到达S时,所走的步数即为L。

算法复杂度:

T~N,S~1

相关题目:

141. Linked List Cycle

142. Linked List Cycle II

202. Happy Number

287. Find the Duplicate Number

Tips:

当需要判断链表或者数组关于环/是否有环/找循环起始点/循环长度,或者需要利用数组的index和val值时,考虑Floyd算法。


Floyd判断环算法总结的更多相关文章

  1. SGU 455 Sequence analysis(Cycle detection,floyd判圈算法)

    题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=455 Due to the slow 'mod' and 'div' operati ...

  2. UVA 11549 CALCULATOR CONUNDRUM(Floyd判圈算法)

    CALCULATOR CONUNDRUM   Alice got a hold of an old calculator that can display n digits. She was bore ...

  3. UVA 11549 Calculator Conundrum (Floyd判圈算法)

    题意:有个老式计算器,每次只能记住一个数字的前n位.现在输入一个整数k,然后反复平方,一直做下去,能得到的最大数是多少.例如,n=1,k=6,那么一次显示:6,3,9,1... 思路:这个题一定会出现 ...

  4. leetcode202(Floyd判圈算法(龟兔赛跑算法))

    Write an algorithm to determine if a number is "happy". 写出一个算法确定一个数是不是快乐数. A happy number ...

  5. Floyd判圈算法

    Floyd判圈算法 leetcode 上 编号为202 的happy number 问题,有点意思.happy number 的定义为: A happy number is a number defi ...

  6. Codeforces Gym 101252D&&floyd判圈算法学习笔记

    一句话题意:x0=1,xi+1=(Axi+xi%B)%C,如果x序列中存在最早的两个相同的元素,输出第二次出现的位置,若在2e7内无解则输出-1. 题解:都不到100天就AFO了才来学这floyd判圈 ...

  7. Floyd判圈算法 UVA 11549 - Calculator Conundrum

    题意:给定一个数k,每次计算k的平方,然后截取最高的n位,然后不断重复这两个步骤,问这样可以得到的最大的数是多少? Floyd判圈算法:这个算法用在循环问题中,例如这个题目中,在不断重复中,一定有一个 ...

  8. Floyd 判圈算法

    Floyd 判圈算法 摘自维基百科, LeetCode 上 141题 Linked List Cycle 用到这个, 觉得很有意思. 记录一下. 链接: https://zh.wikipedia.or ...

  9. UVa 11549 计算器谜题(Floyd判圈算法)

    https://vjudge.net/problem/UVA-11549 题意: 有一个老式计算器,只能显示n位数字,输入一个整数k,然后反复平方,如果溢出的话,计算器会显示结果的最高n位.如果一直这 ...

随机推荐

  1. java如何编写多线程

    1.如何实现多线程 1.1实现Runnable接口,实现run()方法. public class Main4 implements Runnable { public static void mai ...

  2. Price Channel Breakout 交易系统简价及源码

    Price Channel Breakout 交易系统简价及源码 既然这个版有交易系统的模型报告,小弟先在这裡野人献曝一下,把目前正在用的系统拿来请大家批评指教一下. ================ ...

  3. Navicat无法连接SqlServer数据库

    一.起因 原来安装过SqlServer 2008 R2,后来不用卸载了(没清理,单卸载),之后一直通过Navicat远程连接服务器的SqlServer使用. 前两天工作需要,又安装了SqlServer ...

  4. VMware15 安装centos7标准板

    VM主页——>创建虚拟机——>典型——>下一步: 选择安装安装操作系统,进入选择客户机操作系统界面 选择Linux  版本centos7 64位: 下一步——>填写虚拟机名称, ...

  5. 移动质量(MQ)测试系列

    移动质量(MQ)测试 向移动开发者提供专业.稳定.全面.高价值的自动化测试平台. 发现 APP 中的各类隐患,包括 APP 崩溃.各类兼容性.功能性.性能问题等等. MQ 的 5 大功能(兼容性测试. ...

  6. jsp servlet table 集合list 数据 绑定

    删除 前端

  7. webpack的css样式文件加载依赖

    1.需要两个依赖包: npm i style-loader css-loader -D

  8. .Net Core文件上传

    https://www.cnblogs.com/viter/p/10074766.html 1.内置了很多种绑定模型  缺少了一个FromFileAttribute 绑定模型 需要自己实现一个 pub ...

  9. jquery tab切换

    首先引入jquery.js <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...

  10. ArcGIS中KML转为shp文件

    问题:如何将KML转为shp文件? 方法: 1.打开ArcMap -> ArcToolbox: 2.在ArcToolbox中选择“转换工具”-> “由KML转出” -> “KML转图 ...