05 August 2008
给两个坐标,每个坐标由两个整数组成,判断一个坐标是否能够通过(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;
}
}