-
题目:给定四个整数
sx
,sy
,tx
和ty
,如果通过一系列的转换可以从起点(sx, sy)
到达终点(tx, ty)
,则返回true
,否则返回false
。从点(x, y)
可以转换到(x, x+y)
或者(x+y, y)
。1 -
示例:
# 示例 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
-
思路:
这个题目的意思是
tx
和ty
依次相互减,减到某个值能分别等于sx
和sy
则返回True
,否则返回False
tx
和ty
分别大于等于sx
和sy
则继续循环,里面有两种情况,如果tx
大于ty
首先先判断tx
要减去多少ty
,通过(tx - sx) // ty
计算要减ty
的次数,依减完之后若减得的值为0
,将这个值定义为1
;tx
小于ty
同理
判断条件tx
等于sx
并且ty
等于sy
则返回True
,若没有触发返回True
的条件则返回False
有个投机取巧不知道怎么判断的点,就是当为False
时可能一直跳不出while
循环,此处设置了一个count
值,若count
循环了1000
遍,跳出循环
- 解法一:
class Solution:
def reachingPoints(self, sx: int, sy: int, tx: int, ty: int) -> bool:
count = 0
while tx >= sx and ty >= sy:
count += 1
if tx > ty:
cnt = (tx - sx) // ty
tx -= cnt * ty
if tx == 0:
tx = ty
elif tx < ty:
cnt = (ty - sy) // tx
ty -= cnt * tx
if ty == 0:
ty = tx
if tx == sx and ty == sy:
return True
if count > 1000:
break
return False
- 思路:
用递归,设置跳出条件,若变化前的值等于变化后的值,返回True;若变化前的值大于等于变化后的值,返回False
若tx大于ty则将tx依次减去给定条件的最大倍数的ty的值,前提是倍数必须得是减去sx或ty的最大值;若tx小于ty同理
进入递归,返回调用本身函数的最终结果
- 解法二:
class Solution:
def reachingPoints(self, sx: int, sy: int, tx: int, ty: int) -> bool:
if sx == tx and sy == ty:
return True
if sx > tx and sy > ty:
return False
if tx > ty:
tx -= max(tx - max(sx, ty) // ty, 1) * ty
elif tx < ty:
ty -= max(ty - max(sy, tx) // tx, 1) * tx
return self.reachingPoints(sx, sy, tx, ty)
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reaching-points ↩︎