日新计划|780. 到达终点

81 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情

一、题目描述:

给定四个整数 sx , sy ,tx 和 ty,如果通过一系列的转换可以从起点 (sx, sy) 到达终点 (tx, ty),则返回 true,否则返回 false。

从点 (x, y) 可以转换到 (x, x+y) 或者 (x+y, y)。

示例 1:

输入: sx = 1, sy = 1, tx = 3, ty = 5 输出: true 解释: 可以通过以下一系列转换从起点转换到终点: (1, 1) -> (1, 2) (1, 2) -> (3, 2) (3, 2) -> (3, 5) 示例 2:

输入: sx = 1, sy = 1, tx = 2, ty = 2 输出: false 示例 3:

输入: sx = 1, sy = 1, tx = 1, ty = 1 输出: true

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/re…

二、思路分析:

以本题给出的示例sx = 1, sy = 1, tx = 3, ty = 5为例

由(1,1)变换至(3,5)虽然结果路径只有一条,但是需要做无用的遍历多次才能得到最终解,而自底向上的路径只有(3,5) -> (3,2) -> (1,2) -> (1,1)这一条,可以只遍历一次便可得出答案。每次都将最大的x或者y减去相对应的yx,再将差值赋给最大的坐标,最后如果sx == tx || sy == ty时需要进行特判。

tx >= sx && ty >= sy, 因为tx >= 1、ty >= 1, 只能变大,无法变小 (tx, ty) 可以写成 (tx, k * tx + c) 或者 (k * ty + c, ty) 的形式,其中c为ty % tx 或 tx % ty 每次都拿大的数减去小的数(小减大会变为负数,不合法),根据上一点,可以用 tx % ty 或者 ty % tx 的形式一步到位减去多个重复值。 最后分类谈论一下,当tx==sx时有ty = sy + k * tx, k >= 0; 当ty==sy时有tx = sx + k * ty, k >= 0;

三、AC代码

class Solution {
    public boolean reachingPoints(int sx, int sy, int tx, int ty) {
        while (tx > sx && ty > sy) {
            if (tx > ty) {
                tx -= ty;
            } else {
                ty -= tx;
            }
        }
        return tx == sx && ty >= sy && (ty - sy) % tx == 0 || tx >= sx && ty == sy && (tx - sx) % ty == 0;
    }
}

四、总结:

掘友们,解题不易,如果觉得有用就留下个赞或评论再走吧!谢啦~ 💐