A move consists of taking a point
(x, y)
and transforming it to either(x, x+y)
or(x+y, y)
.Given a starting point
(sx, sy)
and a target point(tx, ty)
, returnTrue
if and only if a sequence of moves exists to transform the point(sx, sy)
to(tx, ty)
. Otherwise, returnFalse
.
Examples: Input: sx = 1, sy = 1, tx = 3, ty = 5 Output: True Explanation: One series of moves that transforms the starting point to the target is: (1, 1) -> (1, 2) (1, 2) -> (3, 2) (3, 2) -> (3, 5) Input: sx = 1, sy = 1, tx = 2, ty = 2 Output: False Input: sx = 1, sy = 1, tx = 1, ty = 1 Output: True
Approach #1: Math. [Java]
class Solution { public boolean reachingPoints(int sx, int sy, int tx, int ty) { while (sx < tx && sy < ty) { if (ty > tx) ty %= tx; else tx %= ty; } return sx == tx && sy <= ty && (ty - sy) % sx == 0 || sy == ty && sx <= tx && (tx - sx) % sy == 0; } }
Analysis:
If we start from sx, sy, it will be hard to find tx, ty.
If we start from tx, ty, we can find only one path to go back to sx, sy.
First, if 2 target points are still bigger than 2 starting point, we reduce target points.
Second, check if reduce target points to (x, y + kx) or (x + ky, y).
Reference:
https://leetcode.com/problems/reaching-points/discuss/114856/JavaC%2B%2BPython-Modulo-from-the-End