力扣每日一题0409-780. 到达终点

114 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第8天,点击查看活动详情 。

给定四个整数 sx , sytxty,如果通过一系列的转换可以从起点 (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`1 <= sx, sy, tx, ty <= 10^9`

反向计算

如果从 (sx,sy)(\textit{sx}, \textit{sy}) 开始正向计算,则可能的情况非常多,会超出时间限制。注意到 sx,sy,tx,ty\textit{sx}, \textit{sy}, \textit{tx}, \textit{ty} 都是正整数,因此对于给定的状态 (tx,ty)(\textit{tx}, \textit{ty}),只有当 txty\textit{tx} \ne \textit{ty} 时才存在上一个状态,且上一个状态唯一,可能的情况如下:

  • 如果 tx=ty\textit{tx} = \textit{ty},不存在上一个状态,状态 (tx,ty)(\textit{tx}, \textit{ty}) 即为起点状态;
  • 如果 tx>ty\textit{tx} > \textit{ty},则上一个状态是 (txty,ty)(\textit{tx} - \textit{ty}, \textit{ty});
  • 如果 tx<ty\textit{tx} < \textit{ty},则上一个状态是 (tx,tytx)(\textit{tx}, \textit{ty} - \textit{tx})

因此可以从 (tx,ty)(\textit{tx}, \textit{ty}) 开始反向计算,判断是否可以到达状态 (sx,sy)(\textit{sx}, \textit{sy})。当tx>sx,ty>sy,txty\textit{tx} > \textit{sx}, \textit{ty} > \textit{sy}, \textit{tx} \ne \textit{ty} 三个条件同时成立时,执行反向操作,每一步操作更新 (tx,ty)(\textit{tx}, \textit{ty}) 的值,直到反向操作的条件不成立。

由于每一步反向操作一定是将 tx\textit{tx}ty\textit{ty} 中的较大的值减小,因此当 tx>ty\textit{tx} > \textit{ty} 时可以直接将 tx\textit{tx} 的值更新为 txmodty\textit{tx} \bmod \textit{ty},当 tx<ty\textit{tx} < \textit{ty} 时可以直接将 ty\textit{ty} 的值更新为 tymodtx\textit{ty} \bmod \textit{tx}

当反向操作的条件不成立时,根据 tx\textit{tx}ty\textit{ty} 的不同情况分别判断是否可以从起点转换到终点。

  • 如果 tx=sx\textit{tx} = \textit{sx}ty=sy\textit{ty} = \textit{sy},则已经到达起点状态,因此可以从起点转换到终点。
  • 如果 tx=sx\textit{tx} = \textit{sx}tysy\textit{ty} \ne \textit{sy},则 tx\textit{tx} 不能继续减小,只能减小 ty\textit{ty},因此只有当 ty>sy\textit{ty} > \textit{sy}(tysy)modtx=0(\textit{ty} - \textit{sy}) \bmod \textit{tx} = 0 时可以从起点转换到终点。
  • 如果 ty=sy\textit{ty} = \textit{sy}txsx\textit{tx} \ne \textit{sx},则 ty\textit{ty} 不能继续减小,只能减小 tx\textit{tx},因此只有当 tx>sx\textit{tx} > \textit{sx}(txsx)modty=0(\textit{tx} - \textit{sx}) \bmod \textit{ty} = 0 时可以从起点转换到终点。
  • 如果 txsx\textit{tx} \ne \textit{sx}tysy\textit{ty} \ne \textit{sy},则不可以从起点转换到终点。
var reachingPoints = function(sx, sy, tx, ty) {
    while (tx > sx && ty > sy && tx != ty) {
        if (tx > ty) {
            tx %= ty;
        } else {
            ty %= tx;
        }
    }
    if (tx === sx && ty === sy) {
        return true;
    } else if (tx === sx) {
        return ty > sy && (ty - sy) % tx === 0;
    } else if (ty === sy) {
        return tx > sx && (tx - sx) % ty === 0;
    } else {
        return false;
    }
};

image.png