其他分享
首页 > 其他分享> > 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);
    }
};

 

运行结果

 

 

标签:sy,终点,780,tx,ty,int,sx,return,LeetCode
来源: https://www.cnblogs.com/zhangshihang/p/16122035.html