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. SCOI 2019 划水记

    (此处不应有目录,爆零的过程得慢慢看) 鸽子来更新游记了 orz UESTC. Day -1 两场傻逼信心考试都没AK. 第一场真的气,一个边界觉得是i - 1,然后不知道为啥改成了i,挂了6个点,然 ...

  2. caffe特征层可视化

    #参考1:https://blog.csdn.net/sushiqian/article/details/78614133#参考2:https://blog.csdn.net/thy_2014/art ...

  3. Python下关于RSA解密模块的使用

    最近筹备一场CTF比赛发现了一道关于RSA解密的题如下: #小明得到了一个 RSA 加密信息,你能帮他解开吗? n = 4106906565495961459775020773869808579876 ...

  4. 推荐一个SAM文件或者bam文件中flag含义解释工具

    SAM是Sequence Alignment/Map 的缩写.像bwa等软件序列比对结果都会输出这样的文件.samtools网站上有专门的文档介绍SAM文件.具体地址:http://samtools. ...

  5. Nginx1.14.0+ModSecurity实现简单的WAF

    一.编译安装Nginx 1.安装依赖环境 $ yum -y install gcc-c++ flex bison yajl yajl-devel curl-devel curl GeoIP-devel ...

  6. C++ 获取Unix时间戳

    什么是Unix时间戳? Unix时间戳(Unix timestamp),或称Unix时间(Unix time).POSIX时间(POSIX time),是一种时间表示方式,定义为从格林威治时间1970 ...

  7. python识别图片

    import requestsfrom aip import AipOcr image = requests.get('https://static.pandateacher.com/7b5d6d8d ...

  8. react native 0.55.4 rctsrwebsocket会崩溃的问题解决 直接原文覆盖

    //// Copyright 2012 Square Inc.//// Licensed under the Apache License, Version 2.0 (the "Licens ...

  9. 第二章 python变量及文件

    1.环境变量 1.配置环境变量不是必须的2.配置环境变量的目的:为终端提供执行环境 2.Python代码执行 1.交互式       -- 控制台直接编写运行Python代码       -- 1.打 ...

  10. 《SQL 基础教程》第六章:函数、谓词、CASE 表达式

    函数是 SQL 中的一部分.在 SQL 中,除了普通的函数之外,还有特殊的函数(谓词和 CASE 表达式)用于各种情况. 函数 函数的种类有: 算术函数 字符串函数 日期函数 转换函数(用于转换数据类 ...