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位.如果一直这 ...
随机推荐
- {408} client block at 0x005D4D10, subtype 0, 64 bytes long.a CButton object at $005D4D10, 64 bytes long
现象:mfc动态生成了很多控件,new的,退出时也delet了,但是还是出现了标题的错误 解决:在任何可以执行的地方加代码: CMFCVisualManager ::SetDefaultManager ...
- Best Practices for Assembly Loading
原文链接 This article discusses ways to avoid problems of type identity that can lead to InvalidCastExce ...
- windows服务安装,卸载
首先管理员身份进入cmd cd C:\Windows\Microsoft.NET\Framework64\v4.0.30319\ 进入C:\Windows\Microsoft.NET\Framewor ...
- vue安装之后的报错处理---chromedriver@2.35.0 install: `node install.js`
报错:chromedriver@2.35.0 install: `node install.js` 这个错误的解决方法就是在你创建的项目目录,比如你创建的项目叫myVue,然后你就要在myVue这个目 ...
- struts.xml,报错 1 c.opensymphony.xwork2.util.DomHelper
ERROR c.opensymphony.xwork2.util.DomHelper - The content of element type "action" must mat ...
- Vue开发与调试工具
vscode: Visual Studio Code https://code.visualstudio.com/Download 可以下载各个版本的,Windows/ Debian /Mac 等 W ...
- HDU 3466 Proud Merchants(背包问题,要好好理解)
Problem Description Recently, iSea went to an ancient country. For such a long time, it was the most ...
- DAY 17常用模块
一.时间模块:time 1.时间戳:time.time() # 可以作为数据的唯一标识 print(time.time) # 1554878849.8452318 2.延迟线程的运行:time.sle ...
- java异常处理try catch finally
1 异常 1.1 异常处理的作用 在编程时,如果出现文件打开失败,读写文件就会异常退出.如果出现内存溢出错误,程序也会异常退出.如果不能对这些异常进行处理.程序则无法正常运行.所 ...
- vi编程技巧:
h #向上j #向左k #向右l #向下a #插入o #插入一行,并在行首开始O #在当前行前插入一行,并在行首开始dd #删除当前行x #删除当前字符yy #复制当前行p #在当前行后面粘贴P #在 ...