Floyd判断环算法总结
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判断环算法总结的更多相关文章
- 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 ...
- UVA 11549 CALCULATOR CONUNDRUM(Floyd判圈算法)
CALCULATOR CONUNDRUM Alice got a hold of an old calculator that can display n digits. She was bore ...
- UVA 11549 Calculator Conundrum (Floyd判圈算法)
题意:有个老式计算器,每次只能记住一个数字的前n位.现在输入一个整数k,然后反复平方,一直做下去,能得到的最大数是多少.例如,n=1,k=6,那么一次显示:6,3,9,1... 思路:这个题一定会出现 ...
- leetcode202(Floyd判圈算法(龟兔赛跑算法))
Write an algorithm to determine if a number is "happy". 写出一个算法确定一个数是不是快乐数. A happy number ...
- Floyd判圈算法
Floyd判圈算法 leetcode 上 编号为202 的happy number 问题,有点意思.happy number 的定义为: A happy number is a number defi ...
- Codeforces Gym 101252D&&floyd判圈算法学习笔记
一句话题意:x0=1,xi+1=(Axi+xi%B)%C,如果x序列中存在最早的两个相同的元素,输出第二次出现的位置,若在2e7内无解则输出-1. 题解:都不到100天就AFO了才来学这floyd判圈 ...
- Floyd判圈算法 UVA 11549 - Calculator Conundrum
题意:给定一个数k,每次计算k的平方,然后截取最高的n位,然后不断重复这两个步骤,问这样可以得到的最大的数是多少? Floyd判圈算法:这个算法用在循环问题中,例如这个题目中,在不断重复中,一定有一个 ...
- Floyd 判圈算法
Floyd 判圈算法 摘自维基百科, LeetCode 上 141题 Linked List Cycle 用到这个, 觉得很有意思. 记录一下. 链接: https://zh.wikipedia.or ...
- UVa 11549 计算器谜题(Floyd判圈算法)
https://vjudge.net/problem/UVA-11549 题意: 有一个老式计算器,只能显示n位数字,输入一个整数k,然后反复平方,如果溢出的话,计算器会显示结果的最高n位.如果一直这 ...
随机推荐
- java如何编写多线程
1.如何实现多线程 1.1实现Runnable接口,实现run()方法. public class Main4 implements Runnable { public static void mai ...
- Price Channel Breakout 交易系统简价及源码
Price Channel Breakout 交易系统简价及源码 既然这个版有交易系统的模型报告,小弟先在这裡野人献曝一下,把目前正在用的系统拿来请大家批评指教一下. ================ ...
- Navicat无法连接SqlServer数据库
一.起因 原来安装过SqlServer 2008 R2,后来不用卸载了(没清理,单卸载),之后一直通过Navicat远程连接服务器的SqlServer使用. 前两天工作需要,又安装了SqlServer ...
- VMware15 安装centos7标准板
VM主页——>创建虚拟机——>典型——>下一步: 选择安装安装操作系统,进入选择客户机操作系统界面 选择Linux 版本centos7 64位: 下一步——>填写虚拟机名称, ...
- 移动质量(MQ)测试系列
移动质量(MQ)测试 向移动开发者提供专业.稳定.全面.高价值的自动化测试平台. 发现 APP 中的各类隐患,包括 APP 崩溃.各类兼容性.功能性.性能问题等等. MQ 的 5 大功能(兼容性测试. ...
- jsp servlet table 集合list 数据 绑定
删除 前端
- webpack的css样式文件加载依赖
1.需要两个依赖包: npm i style-loader css-loader -D
- .Net Core文件上传
https://www.cnblogs.com/viter/p/10074766.html 1.内置了很多种绑定模型 缺少了一个FromFileAttribute 绑定模型 需要自己实现一个 pub ...
- jquery tab切换
首先引入jquery.js <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...
- ArcGIS中KML转为shp文件
问题:如何将KML转为shp文件? 方法: 1.打开ArcMap -> ArcToolbox: 2.在ArcToolbox中选择“转换工具”-> “由KML转出” -> “KML转图 ...