题目描述
给定四个整数 sx , sy ,tx 和 ty,如果通过一系列的转换可以从起点 (sx, sy) 到达终点 (tx, ty),则返回 true,否则返回 false。
从点 (x, y) 可以转换到 (x, x+y) 或者 (x+y, y)。
示例 1:
输入: sx = 1, sy = 1, tx = 3, ty = 5
输出: true
解释:
可以通过以下一系列转换从起点转换到终点:
(1, 1) -> (1, 2)
(1, 2) -> (3, 2)
(3, 2) -> (3, 5)
示例 2:
输入: sx = 1, sy = 1, tx = 2, ty = 2
输出: false
示例 3:
输入: sx = 1, sy = 1, tx = 1, ty = 1
输出: true
提示:
- 1 <= sx, sy, tx, ty <= 109
题解思路
正序模拟操作的话,情况会非常多导致超时,因此我们倒序进行操作来进行模拟
- 当ty跟tx都比sy跟sx大的时候
- 判断ty跟tx的大小,因为大的一个总是由小的加过来的
- 当tx=sx ty=sy的时候 直接返回True
- 当tx == sx sy<ty的时候 判断 (ty-sy)%tx==0 也是就ty跟sy的差值是否是tx的倍数
- 同理 当ty == sy sx>tx的时候 判断 (tx-sx)%ty==0 也就是tx跟sx的差值是否是ty的倍数
题解代码
class Solution:
def reachingPoints(self, sx: int, sy: int, tx: int, ty: int) -> bool:
while ty>sy and tx>sx:
if ty>tx:
ty%=tx
else:
tx%=ty
if ty==sy and tx==sx:
return True
elif ty==sy and tx>sx:
return (tx-sx)%ty==0
elif tx==sx and ty>sy:
return (ty-sy)%tx==0
else:
return False