请教HackerRank Number Line Jumps中公式(x2-x1)%(v1-v2)==0的原理
数轴跳跃问题的公式原理解释
先从问题本质入手:两只袋鼠同时起跳,每次跳跃的次数完全一致,要判断它们会不会在某一时刻处于同一位置,我们可以用数学等式来拆解这个问题。
假设跳了k次后相遇(k必须是≥0的整数——总不能跳负数次或者半次吧),此时两只袋鼠的位置必然相等,所以可以列出等式:
x1 + k * v1 = x2 + k * v2
接下来对等式做变形整理:
- 把带
k的项移到一侧,常数项移到另一侧:x1 - x2 = k * v2 - k * v1 - 把右边的
k提取出来:x1 - x2 = k * (v2 - v1) - 两边同时乘-1调整符号,和题解里的公式对应上:
x2 - x1 = k * (v1 - v2)
现在要算出k的取值,就可以得到:
k = (x2 - x1) / (v1 - v2)
要让这个k符合实际情况,得满足两个核心条件:
- 首先,
v1 - v2不能为0——也就是两只袋鼠速度不能相同,不然要么一开始就在一起,要么永远追不上。 - 其次,
(x2 - x1)必须能被(v1 - v2)整除,也就是题解里的(x2-x1)%(v1-v2)==0,这样算出来的k才是整数,毕竟跳半次不算数。 - 最后还要保证
k是非负的:比如如果袋鼠1初始位置在袋鼠2后面(x1 < x2),那袋鼠1的速度必须比袋鼠2快(v1 > v2),这时候v1 - v2是正数,x2 - x1也是正数,算出来的k是正整数;如果袋鼠1在前面(x1 > x2),那袋鼠2的速度得更快(v2 > v1),这时候x2 - x1是负数,v1 - v2也是负数,负负得正,k还是正整数。
你的代码用循环模拟跳跃的思路是对的,但如果初始位置差特别大,循环次数会很多,效率不如数学公式直接计算来得高。
内容的提问来源于stack exchange,提问作者Đồng Nguyễn
相关产品推荐
相关产品推荐

