题目描述:
给定四个整数 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));
}
}
这篇博客讨论了一种编程问题,涉及如何判断从起点(sx, sy)是否能通过特定操作到达终点(tx, ty)。问题的关键在于一系列转换,允许从(x, y)移动到(x, x+y)或(x+y, y)。作者提供了一个倒推算法,通过取余操作减少计算次数,最终判断能否达到目标。示例展示了算法的有效性和在不同情况下的应用。
1120

被折叠的 条评论
为什么被折叠?



