>>>>>>>>>>>>>>>我使用了同余!!!点此了解 解题思路 及 数学原理!<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
其他题解光讲原理不讲思路,知其然不知其所以然,这可不好。我来讲一讲解题的原理吧。
这道题的知识点其实是,但是用的知识点比较浅,主要考察的是思路。
预备知识
简单说一下同余。同余的形式一般如下:
它的意义其实很简单,熟悉编程的大家早就见过了,即:。
带入这个题中,设d为环的长度,说白了就是我们只关心游标在环的哪个节点上,不关心它套了多少圈。
设圈长为d,显然这道题里同余都是以为底的(即),为了方便我后边就省略掉了。
解题思路
首先先判断有无环,使用经典快慢指针即可,反正出题人也没本事发明个新算法不是?
我们把具体情况画出来。其中,是列表头,是环入口,是快慢指针交汇的地方,、、的长度分别为、、。
然后诸位大可以开始拔头发考虑如何从已知的O、B点挪到A点。
推导
所以,我们能从快慢指针那里学到啥呢?
设慢指针的移动距离为,则由:1. 快指针速度是慢指针两倍、2. 慢指针最后落在了B点,可得:
由及 可得 。已知,所以
。
既然,那把盘到环上它就正好与点重合!我在示意图中以表示。单从套圈的角度来看,等效于。
可能有同学看到就兴奋了!没错!,因此我们从出发走步就走到了!(或者说,由可知,走等效于走步)
那么如何走步呢? (边界条件:如果就是,那么就不用走了,直接返回,退出)
很简单,嘛!两个慢指针分别从、出发,相交处就是。
没反应过来?那这样看:。不就代表着环的入口嘛,至于两个指针要转几个圈圈才能遇到,我不管~~~
以上。