GuilinDev

Lc0780

05 August 2008

780. Reaching Points

给两个坐标,每个坐标由两个整数组成,判断一个坐标是否能够通过(x, x + y)和(x + y, y)这两个操作得到另外一个坐标

辗转相减,反方向回到起点,终点一定会经过大小两数相加而来

例如示例[1,1]–>[3,5]

[1,1]–>[1,2]–>[3,2]–>[3,5]

若是正向思考,当“终点的数值”比较大的时候,可能的情况会太多😨

故而我们倒着往前来,二数相减,由于正向推理我们均是较小数加到较大数上

因此我们这里用较大数减去较小数,最终可得出答案。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class Solution {
    public boolean reachingPoints(int sx, int sy, int tx, int ty) {
        //x,y终点坐标均大于起始坐标,故相减,大数减去小数
        //若x与y相等则直接减去
        while (tx > sx && ty > sy) {
            if (tx > ty) {
                tx -= ty;
            } else {
                ty -= tx;
            }
        }
        //二者之一小于起始坐标,则直接返回false
        if (tx < sx || ty < sy) {
            return false;
        }
        //若x达到起始坐标,则持续用y减去x,直到y小于等于y的起始坐标
        if (tx == sx) {
            while (ty > sy) {
                ty -= tx;
            }
            if (ty < sy) {
                return false;
            }
            return true;
        }
        //若y达到起始坐标,则持续用x减去y,直到x小于等于x的起始坐标
        if (ty == sy) {
            while (tx > sx) {
                tx -= ty;
            }
            if (tx < sx) {
                return false;
            }
            return true;
        }
        return true;
    }
}