题目描述:
给定四个整数 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 <= 109
代码:
package dayLeetCode;
public class dayleetcode780 {
// 倒推, 永远对tx,ty中较大的那个元素进行操作, 因为较小的那个元素一定和上一次操作的值一样
// 该题目难点在于 倒推(这个题目很明显到这推倒会更容易), 减少时间复杂度(一次只减一个的话会超时),所以我们每次进行取余操作,即减去小值的n倍
public boolean reachingPoints(int sx, int sy, int tx, int ty) {
boolean ansflag = false;
// 当tx和ty相等时 无论sx sy为何值进行(x,x+y)(x+y,y)操作都无法得到(tx,ty)
while (tx > sx && ty > sy && tx != ty){
if (tx > ty)
tx %= ty;
else
ty %= tx;
}
if (tx == sx && ty == sy){
ansflag = true;
} else if (tx == sx){
ansflag = ty > sy && (ty - sy) % tx == 0 ? true : false;
} else if (ty == sy){
ansflag = tx > sx && (tx - sx) % ty == 0 ? true : false;
} else {
ansflag = false;
}
return ansflag;
}
public static void main(String[] args) {
dayleetcode780 obj = new dayleetcode780();
System.out.println(obj.reachingPoints(1, 1, 3, 5));
}
}