豆包 LeetCode 780.到达终点 public boolean reachingPoints(int sx, int sy, int tx, int ty)
1. 正向不行: (x,y) → (x+y,y) / (x,x+y)会指数爆炸。这题正向会爆栈/超时,必须逆向推导,我给你最精简、面试满分的 Java 解法。// 逆向减,一直减到 tx >= sx && ty >= sy。LeetCode 780 标准 Java 代码。需要我给你手推一遍样例,帮你彻底吃透吗?核心思路(10 秒看懂)
·
这题正向会爆栈/超时,必须逆向推导,我给你最精简、面试满分的 Java 解法。
LeetCode 780 标准 Java 代码
java
class Solution {
public boolean reachingPoints(int sx, int sy, int tx, int ty) {
// 逆向减,一直减到 tx >= sx && ty >= sy
while (tx >= sx && ty >= sy) {
if (tx == ty) break;
if (tx > ty) {
// 看 ty 已经到目标没
if (ty == sy) {
return (tx - sx) % ty == 0;
}
tx %= ty;
} else {
if (tx == sx) {
return (ty - sy) % tx == 0;
}
ty %= tx;
}
}
// 最后看是否刚好等于起点
return tx == sx && ty == sy;
}
}
核心思路(10 秒看懂)
1. 正向不行: (x,y) → (x+y,y) / (x,x+y) 会指数爆炸。
2. 逆向做:
- 大的那个数 = 小的数 + 上一步的数
- 所以反过来:大数不断减小数(用取模快速减)。
3. 当某一维已经等于起点时,直接看另一维差值能不能被它整除。
4. 最后判断是否刚好回到 (sx, sy) 。
极简总结
- 逆向 + 取模 = 秒杀大数
- 时间复杂度:O(log(max(tx, ty)))
需要我给你手推一遍样例,帮你彻底吃透吗?
更多推荐




所有评论(0)