leetcode 287 寻找重复数

一个方法必定是可以用数学证明的,我看题解只能看懂思想,但是为什么会这样,我想可能会有人和我一样有困惑,所以我这里用数学证明了这个方法的正确性。

光想不如动手证明啊。

我们先定义几个变量,从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点入口点。

证毕!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值