一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第8天,点击查看活动详情 。
给定四个整数 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‘
反向计算
如果从 (sx,sy) 开始正向计算,则可能的情况非常多,会超出时间限制。注意到 sx,sy,tx,ty 都是正整数,因此对于给定的状态 (tx,ty),只有当 tx=ty 时才存在上一个状态,且上一个状态唯一,可能的情况如下:
- 如果 tx=ty,不存在上一个状态,状态 (tx,ty) 即为起点状态;
- 如果 tx>ty,则上一个状态是 (tx−ty,ty);
- 如果 tx<ty,则上一个状态是 (tx,ty−tx)。
因此可以从 (tx,ty) 开始反向计算,判断是否可以到达状态 (sx,sy)。当tx>sx,ty>sy,tx=ty 三个条件同时成立时,执行反向操作,每一步操作更新 (tx,ty) 的值,直到反向操作的条件不成立。
由于每一步反向操作一定是将 tx 和 ty 中的较大的值减小,因此当 tx>ty 时可以直接将 tx 的值更新为 txmodty,当 tx<ty 时可以直接将 ty 的值更新为 tymodtx。
当反向操作的条件不成立时,根据 tx 和 ty 的不同情况分别判断是否可以从起点转换到终点。
- 如果 tx=sx 且 ty=sy,则已经到达起点状态,因此可以从起点转换到终点。
- 如果 tx=sx 且 ty=sy,则 tx 不能继续减小,只能减小 ty,因此只有当 ty>sy 且 (ty−sy)modtx=0 时可以从起点转换到终点。
- 如果 ty=sy 且 tx=sx,则 ty 不能继续减小,只能减小 tx,因此只有当 tx>sx 且 (tx−sx)modty=0 时可以从起点转换到终点。
- 如果 tx=sx 且 ty=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
}
}
