LeetCode-780 到达终点

简介: LeetCode-780 到达终点

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/reaching-points

题目描述

给定四个整数 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

 

提示:

1 <= sx, sy, tx, ty <= 109

解题思路

很有趣的一道逆向思维题,如果正向来判断(sx, sy)到达(tx, ty)必然是十分困难的,如果是单次相加,那么时间复杂度会超出,如果是相乘,那么被乘数是无法确定的。但是如果从(tx, ty)反推回(sx, sy)是十分容易的,因为没必要关注中间相减的过程,直接使用取模运算就可以看出从(tx, ty)可以到达(sx, sy),如果使用单次相减就会超时。

逆推过程中,当x和y相等的时候,那么坐标就无法进行变换了,因为下一次逆推的结果坐标中会出现0,不符合题意,所以在x和y不相等的时候,同时,x和y分别都比sx,sy大的时候,将大的那个值对小的那个取模,逆推回去,在最终无法变换时进行状态的判断。

如果(x,y)等于(sx,sy)很显然,可以到达(sx,sy),如果x == sx,那么此时可以操作的坐标仅仅就是y,需要判断sy是否可以通过相加n个x等于了y,此时将y-sy对x取模,判断是否等于0就可以了,不能使用y对x取模判断余数为sy这种方法,因为如果sy可以被x整除,会产生错误的判断。同理,对于y == sy的情况也一样,如果x和y都不等于sx和sy,那么x和y无法达到sx和sy。

代码展示

 

class Solution {
public:
    bool check(int x, int y, int sx, int sy)
    {
        if(x == sx && y == sy)
            return true;
        else if(x == sx && y > sy)
            return (y - sy) % x == 0;
        else if(y == sy && x > sx)
            return (x - sx) % y == 0;
        else
            return false;
    }
    bool reachingPoints(int sx, int sy, int tx, int ty) {
        int x = tx, y = ty;
        while(x != y && x > sx && y > sy)
        {
            if(x > y)
                x = x % y;
            else
                y = y % x;
        }
        return check(x, y, sx, sy);
    }
};

运行结果

 

相关文章
|
3天前
|
算法 测试技术 C++
【动态规划】【图论】【C++算法】1928规定时间内到达终点的最小花费
【动态规划】【图论】【C++算法】1928规定时间内到达终点的最小花费
|
3天前
|
算法 测试技术 C#
【数学】【C++算法】780. 到达终点
【数学】【C++算法】780. 到达终点
【图论】【深度优先搜索】【换根法】2858. 可以到达每一个节点的最少边反转次数
【图论】【深度优先搜索】【换根法】2858. 可以到达每一个节点的最少边反转次数
|
3天前
|
算法 前端开发
图中的最长环
图中的最长环
23 0
|
3天前
leetcode-754:到达终点数字
leetcode-754:到达终点数字
16 0
|
3天前
假设你正在玩跳格子(所有格子排成一个纵列)游戏。需要 跳完n 个格子你才能抵达终点。 每次你可以跳 1 或 2 个格子。你有多少种不同的方法可以到达终点呢? 注意:给定 n 是一个正整数。
假设你正在玩跳格子(所有格子排成一个纵列)游戏。需要 跳完n 个格子你才能抵达终点。 每次你可以跳 1 或 2 个格子。你有多少种不同的方法可以到达终点呢? 注意:给定 n 是一个正整数。
|
3天前
|
算法 测试技术 C#
[二分查找]LeetCode1964:找出到每个位置为止最长的有效障碍赛跑路线
[二分查找]LeetCode1964:找出到每个位置为止最长的有效障碍赛跑路线
|
3天前
leetcode-1964:找出到每个位置为止最长的有效障碍赛跑路线
leetcode-1964:找出到每个位置为止最长的有效障碍赛跑路线
18 0
|
3天前
|
算法 测试技术 C#
【动态规划】【广度优先搜索】LeetCode:2617 网格图中最少访问的格子数
【动态规划】【广度优先搜索】LeetCode:2617 网格图中最少访问的格子数
|
3天前
leetcode-6135:图中的最长环
leetcode-6135:图中的最长环
24 0