LeetCode----到达终点
题目描述
从点 (x, y)
可以转换到 (x, x+y)
或者 (x+y, y)
。
给定一个起点 (sx, sy)
和一个终点 (tx, ty)
如果通过一系列的转换可以从起点到达终点,则返回 True
,否则返回 False
。
示例:
输入: sx = 1, sy = 1, tx = 3, ty = 5
输出: True
解释:
可以通过以下一系列转换从起点转换到终点:
(1, 1) -> (1, 2)
(1, 2) -> (3, 2)
(3, 2) -> (3, 5)
输入: sx = 1, sy = 1, tx = 2, ty = 2
输出: False
输入: sx = 1, sy = 1, tx = 1, ty = 1
输出: True
思路
每次有 2 个选择,如果从起点往前走,就是一个二叉树,后面结果越来越多
既然给定了终点(虽然不一定有给定起点),但是倒着走回去只有一条路
当往回走的过程中,点都小于起点坐标,说明一定不会经过给定起点
代码
class Solution {
public boolean reachingPoints(int sx, int sy, int tx, int ty) {
if(sx == tx && sy == ty) return true;
if(sx > tx || sy > ty) return false;
if(tx > ty) {
tx -= ty; // 先走一步再说(没病走两步~)
tx -= tx-ty > sx ? (tx-sx)/ty*ty : 0; // 如果 2 者差值太大,会导致栈溢出,那就跨一大步,省去不必要递归
} else {
ty -= tx;
ty -= ty-tx > sy ? (ty-sy)/tx*tx : 0;
}
return reachingPoints(sx, sy, tx, ty);
}
}