一个方法必定是可以用数学证明的,我看题解只能看懂思想,但是为什么会这样,我想可能会有人和我一样有困惑,所以我这里用数学证明了这个方法的正确性。
光想不如动手证明啊。
我们先定义几个变量,从A点到B点的距离为m,以B点为入口的环长度为n;
题解中示意:快指针fast 以2为速度移动,而慢指针slow以1为速度移动。
1. 当slow第一次到达B点时,Distance(slow)=m,Distance(fast)=2*m;记此时fast的位置为C,则B顺时针方向移动到C点的距离设为x,则x=(2*m-m)%n,我们假设fast经过了k圈,则m=k*n+x=>m-x=k*n。
2.fast和slow继续移动,直到两者相遇,我们学过物理,以相对速度可以求得时间,C顺时针移动到B点的距离为n-x;fast相对于slow的速度为1,那么时间即为(n-x)/1=n-x;那么设此时fast和slow在D处相遇,B顺时针移动到D点距离为n-x;
3. 现在我们fast不需要移动,我们让第三个指针third从A点开始移动,速度和slow一样为1;
当third移动到B点时,slow也行驶了距离m,所以此时位置为(n-x+m)%n;注意上面深色的表达式 m-x=k*n,
带入即可得到 (k*n+n)%n=0;也就是说,此时slow也到达了B点入口点。
证毕!!