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. 7.20 Codeforces Beta Round #8

    链接:codeforces.com/contest/8 A 原因:RE,fantasy 的字符串的长度可能大于原字符串. B 题意:上下左右走,可能要避让障碍,问是否存在一个地图使得给定的路径为当前最 ...

  2. elasticsearch-mapping字段重要属性

    https://blog.csdn.net/gongpulin/article/details/78705205

  3. WinForm 设置窗体启动位置在活动屏幕右下角

    WinForm 设置窗体启动位置在活动屏幕右下角 在多屏幕环境下, 默认使用鼠标所在的屏幕 1. 设置窗体的 StartPosition 为 FormStartPosition.Manual. 2. ...

  4. combineReducers

    const reactInit = '@@react/Init' const combineReducers = (reducers) => { const finalReducers = {} ...

  5. 为 pip install 设置 socks5 代理

    参考 How to use pip with socks proxy? 为 pip install 设置 socks5 代理 设置方法: pip install pysocks pip install ...

  6. sql server把一个库表的某个字段更新到另一张表的相同字段

    缘由:进行update时忘了加where条件,导致所有数据全部update.. sql: 1 update Activity set endTime=b.endTime from idj_tl_bf. ...

  7. ArcGIS Pro开发Web3D应用(2)——地图分屏对比(多屏对比)思路

    很多应用中都需要用到地图联动.多屏对比.二三维分屏.大屏显示,有图形可视化的地方就有事件响应触发:鼠标按下.移动.鼠标滚轮,由此触发了地图上坐标或范围的变化,将这些变化发送给另一个地图并响应这些变化, ...

  8. Kafka知识总结

    1.kafka是什么 类JMS消息队列,结合JMS中的两种模式,可以有多个消费者主动拉取数据,在JMS中只有点对点模式才有消费者主动拉取数据. kafka是一个生产-消费模型. Producer:生产 ...

  9. React子组件和父组件通信

    React子组件和父组件通信包括以下几个方面: 子组件获取父组件属性:props或者state 子组件调用父组件的方法 父组件获取子组件的属性:props或者state 父组件调用子组件的方法 我们从 ...

  10. 2018-2019-2 网络对抗技术 20165303 Exp3 免杀原理与实践

    实验内容 一. 正确使用msf编码器(0.5分),msfvenom生成如jar之类的其他文件(0.5分),veil-evasion(0.5分),加壳工具(0.5分),使用shellcode编程(1分) ...