780. 到達終點
從點 (x, y) 可以轉換到 (x, x+y) 或者 (x+y, y)。
給定一個起點 (sx, sy) 和一個終點 (tx, ty),如果通過一系列的轉換可以從起點到達終點,則返回 True ,否則返回 False。
示例:
輸入: sx = 1, sy = 1, tx = 3, ty = 5
輸出: True
解釋:
可以通過以下一系列轉換從起點轉換到終點:
(1, 1) -> (1, 2)
(1, 2) -> (3, 2)
(3, 2) -> (3, 5)
輸入: sx = 1, sy = 1, tx = 2, ty = 2
輸出: False
輸入: sx = 1, sy = 1, tx = 1, ty = 1
輸出: True
注意:
sx, sy, tx, ty 是範圍在 [1, 10^9] 的整數。
PS:
正規套路應該是遞歸
但是!!!
他這個題不正規,所以只能反過來想
從結束點找出發點
class Solution {
public boolean reachingPoints(int sx, int sy, int tx, int ty) {
while (tx >= sx && ty >= sy) {
if (tx == ty) break;
//如果tx>ty 只能是(x+y,y)過來的
if (tx > ty) {
//如果結束點的y大於出發點的y
//tx是x+y來的,所以%y,就是求出原x
if (ty > sy) tx %= ty;
//反過來的話,起始點和結束點的y已經一致了
//只需要看加上的是不是y的倍數
//tx-sx這裏就是n多個y,看他%y是不是能全部%掉
else return (tx - sx) % ty == 0;
} else {
if (tx > sx) ty %= tx;
else return (ty - sy) % tx == 0;
}
}
return (tx == sx && ty == sy);
}
}