这题正向会爆栈/超时,必须逆向推导,我给你最精简、面试满分的 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)))

需要我给你手推一遍样例,帮你彻底吃透吗?

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐