leetcode780. 到达终点
题目
给定四个整数 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 <=
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reaching-points
题解
画出树状结构分析,正向计算会出现很多种状态,计算量复杂,本题应从反向计算,即从终点往起点推理。
假设
tx>ty
(tx,ty)的上一个状态便是(tx-ty,ty);tx<ty
(tx,ty)的上一个状态便是(ty,ty-tx);- 至于这里为什么用
mod
模运算,是考虑存在tx特别小,ty特别大(或者tx特别大,ty特别小)的多次减法的情况,解决这种冗余的运算便是辗转相除法。 - 结束条件:
sx==tx && sy==ty
起点可以到达终点tx==sx
时,判断ty>tx && (ty-sy) % sx == 0
起点是否可以到达终点ty==sy
时,判断tx>ty && (tx-sx) % sy == 0
起点是否可以到达终点
- 解释:
tx==sx
时,判断ty>tx && (ty-sy) % sx == 0
,当sx==tx且ty!=sy时,该数的上一个状态只能是(tx,ty-tx),所以ty要大于tx。(ty-sy) % sx == 0
时,解决ty大数的情况,如:sx=1,sx=6,tx=1,ty=100000。
递归解法
1 | bool reachingPoints(int sx, int sy, int tx, int ty){ |
评论