0780. 到达终点
大约 2 分钟
---
0780. 到达终点
- 标签:数学
- 难度:困难
题目链接
题目大意
描述:
给定四个整数 ,, 和 。
要求:
如果通过一系列的转换可以从起点 到达终点 ,则返回 true,否则返回 false。
从点 可以转换到 或者 。
说明:
- 。
示例:
- 示例 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解题思路
思路 1:数学
从起点 到终点 ,每次可以将 转换为 或 。我们可以反向思考:从 逆推到 。
逆向操作:
- 如果 ,则上一步是 。
- 如果 ,则上一步是 。
优化:
- 当 时,可以一次性减去多个 :(如果 )。
- 否则,需要逐步减去,确保不会跳过 。
思路 1:代码
class Solution:
def reachingPoints(self, sx: int, sy: int, tx: int, ty: int) -> bool:
# 从终点逆推到起点
while tx >= sx and ty >= sy:
if tx == sx and ty == sy:
return True
if tx > ty:
# 上一步是 (tx - ty, ty)
if ty == sy:
# 检查是否能通过减去若干个 ty 到达 sx
return (tx - sx) % ty == 0
# 一次性减去多个 ty
tx %= ty
else:
# 上一步是 (tx, ty - tx)
if tx == sx:
# 检查是否能通过减去若干个 tx 到达 sy
return (ty - sy) % tx == 0
# 一次性减去多个 tx
ty %= tx
return False思路 1:复杂度分析
- 时间复杂度:,类似辗转相除法。
- 空间复杂度:。