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就停下。否则取余之后都不会有正确答案。
再感慨一句:评论区真的强

posted @ 2019-09-07 16:44  于老师的父亲王老爷子  阅读(17)  评论(0)    收藏  举报