LeetCode:

这一题很有意思。
需要注意到坐标都是正数,所以都是往增大的方向发展的。
最重要的,是注意到这一点:给出一个终点,我们可以推出它是从哪些点推来的。
假设前一个点是(x, y), 那么它的可能只有是(x, x+y)或者(x+y, y)。
观察到新的点,横坐标和纵坐标中比较大的那个是新产生的,所以拿大的减去小的,可以得到上一个坐标。
所以我们可以沿着终点往前推。
class Solution {
public:
bool reachingPoints(int sx, int sy, int tx, int ty) {
while (sx < tx || sy < ty) {
if (tx == 0 || ty == 0)//注意避免死循环。
break;
if (tx < ty)
ty -= tx;
else
tx -= ty;
}
return (sx == tx) && (sy == ty);
}
};
一旦有0,就可以break了,否则会死循环。
这段代码是tle。时间太长,因为每次减掉一个。我们改为使用余数。
class Solution {
public:
bool reachingPoints(int sx, int sy, int tx, int ty) {
while (sx < tx && sy < ty) {
if (tx < ty)
ty %= tx;
else
tx %= ty;
}
return sx == tx && sy <= ty && (ty - sy) % sx == 0 ||
sy == ty && sx <= tx && (tx - sx) % sy == 0;
}
};
注意其中的细微差别:这里是只要横纵坐标有一个相等,while就停下。否则取余之后都不会有正确答案。
再感慨一句:评论区真的强
浙公网安备 33010602011771号