LeetCode 780. 到达终点

该博客讨论了一种从终点向起点逆向思维的递推算法,用于判断能否从给定的起点(sx, sy)到达终点(tx, ty)。在每次递推中,通过取模运算更新tx和ty,直到它们等于起点坐标或其中一个坐标相等。如果两者都相等则返回true,否则根据一个坐标相等的情况判断另一个坐标能否通过整除达到起点值。该方法避免了超时问题并提高了效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

780. 到达终点

在这里插入图片描述

思路:当从起点推向终点,每次会有两个状态 (x+y,y) && (x,x+y) ; 这样会超时

而逆向思维:从终点向起点进行推进,每次只有一个状态(|x-y|,y) || (x,|y-x|); 因为每次的x,y都必须大于等于0

先递推到 tx, ty 两个都等于sx ,sy , 或者 其中一个相等

1)当两个相等 说明可以递推得到起点返回true

ps:我自己做的时候没有想到对ty-sy 模 tx 可以判断,这里借鉴的答案。

2)当有一个值相等,递推另外一个值 **注意:取余操作是为了判断相减后是否可以整除tx|ty **,如果可以说明能够sy+tx相加得到 ty。

3) 返回false

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

渝北最后的单纯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值