leetcode--780. 到达终点

  • 题目:给定四个整数 sx , sytx ty,如果通过一系列的转换可以从起点(sx, sy)到达终点 (tx, ty),则返回 true,否则返回 false。从点 (x, y) 可以转换到 (x, x+y) 或者 (x+y, y)1

  • 示例:

# 示例 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

  • 思路:

这个题目的意思是txty依次相互减,减到某个值能分别等于sxsy则返回True,否则返回False
txty分别大于等于sxsy则继续循环,里面有两种情况,如果tx大于ty 首先先判断tx要减去多少ty,通过(tx - sx) // ty计算要减ty的次数,依减完之后若减得的值为0,将这个值定义为1tx小于ty同理
判断条件tx等于sx并且ty等于sy则返回True,若没有触发返回True的条件则返回False
有个投机取巧不知道怎么判断的点,就是当为False时可能一直跳不出while循环,此处设置了一个count值,若count循环了1000遍,跳出循环

  • 解法一:
class Solution:
    def reachingPoints(self, sx: int, sy: int, tx: int, ty: int) -> bool:
        count = 0
        while tx >= sx and ty >= sy:
            count += 1
            if tx > ty:
                cnt = (tx - sx) // ty
                tx -= cnt * ty
                if tx == 0:
                    tx = ty
            elif tx < ty:
                cnt = (ty - sy) // tx
                ty -= cnt * tx
                if ty == 0:
                    ty = tx
            if tx == sx and ty == sy:
                return True
            if count > 1000:
                break
        return False
  • 思路:

用递归,设置跳出条件,若变化前的值等于变化后的值,返回True;若变化前的值大于等于变化后的值,返回False
若tx大于ty则将tx依次减去给定条件的最大倍数的ty的值,前提是倍数必须得是减去sx或ty的最大值;若tx小于ty同理
进入递归,返回调用本身函数的最终结果

  • 解法二:
class Solution:
    def reachingPoints(self, sx: int, sy: int, tx: int, ty: int) -> bool:
        if sx == tx and sy == ty:
            return True
        if sx > tx and sy > ty:
            return False
        if tx > ty:
            tx -= max(tx - max(sx, ty) // ty, 1) * ty
        elif tx < ty:
            ty -= max(ty - max(sy, tx) // tx, 1) * tx
        return self.reachingPoints(sx, sy, tx, ty)

  1. 来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/reaching-points ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值