[Leetcode每日一题]780. 到达终点

这篇博客讨论了一种编程问题,涉及如何判断从起点(sx, sy)是否能通过特定操作到达终点(tx, ty)。问题的关键在于一系列转换,允许从(x, y)移动到(x, x+y)或(x+y, y)。作者提供了一个倒推算法,通过取余操作减少计算次数,最终判断能否达到目标。示例展示了算法的有效性和在不同情况下的应用。
摘要由CSDN通过智能技术生成

题目描述:

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

代码:

package dayLeetCode;

public class dayleetcode780 {
    // 倒推, 永远对tx,ty中较大的那个元素进行操作, 因为较小的那个元素一定和上一次操作的值一样
    // 该题目难点在于 倒推(这个题目很明显到这推倒会更容易), 减少时间复杂度(一次只减一个的话会超时),所以我们每次进行取余操作,即减去小值的n倍
    public boolean reachingPoints(int sx, int sy, int tx, int ty) {
        boolean ansflag = false;
        // 当tx和ty相等时  无论sx sy为何值进行(x,x+y)(x+y,y)操作都无法得到(tx,ty)
        while (tx > sx && ty > sy && tx != ty){
            if (tx > ty)
                tx %= ty;
            else
                ty %= tx;
        }
        if (tx == sx && ty == sy){
            ansflag = true;
        } else if (tx == sx){
            ansflag = ty > sy && (ty - sy) % tx == 0 ? true : false;
        } else if (ty == sy){
            ansflag = tx > sx && (tx - sx) % ty == 0 ? true : false;
        } else {
            ansflag = false;
        }

        return ansflag;

    }

    public static void main(String[] args) {
        dayleetcode780 obj = new dayleetcode780();
        System.out.println(obj.reachingPoints(1, 1, 3, 5));
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值