Java實現 LeetCode 780 到達終點(邏輯題)

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);
    }
 
 
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章