【leetcode每日一题】780. 到达终点

首先献上一版错误答案

func reachingPoints(sx int, sy int, tx int, ty int) bool {
	if sx == tx && sy == ty {
		return true
	}

	if sx > tx || sy > ty {
		return false
	}

	if sx < tx && sx <= (tx-sy) {
		if reachingPoints(sx+sy, sy, tx, ty) {
			return true
		}
	}

	if sy < ty && sx <= (ty-sy) {
		if reachingPoints(sx, sx+sy, tx, ty) {
			return true
		}
	}
	return false
}

没错,我直接按照宽搜的思维正向的去加,相加得到结果后返回。。。想法挺好的就是内存不够用

 然后我就看了题解(实属摆烂了)

思路就是反向推,由tx、ty推回sx、sy,因为正向推的可能情况太多,容易超时。

如果 tx = ty,不存在上一个状态,状态 (tx,ty) 即为起点状态;

如果 tx > ty,则上一个状态是 (tx-ty, ty);

如果 tx < ty,则上一个状态是 (tx, ty-tx)。

而当 sx = tx 或 sy = ty 时,必定只能另一方去进行减法了,这是 (tx-sx)%ty == 0 或 (ty-sy)%tx == 0 ,则说明最终是能成立的。

func reachingPoints(sx int, sy int, tx int, ty int) bool {
	if sx == tx && sy == ty {
		return true
	}

	if tx == ty || tx == 0 || ty == 0 {
		return false
	}

	switch {
	case sx == tx && ty > sy:
		return (ty-sy) % tx == 0
	case sy == ty && tx > sx:
		return (tx-sx) % ty == 0
	case ty > tx:
		ty = ty % tx
		return reachingPoints(sx, sy, tx, ty)
	default:
		tx = tx % ty
		return reachingPoints(sx, sy, tx, ty)
	}
}

PS:评论区看到一老哥说得挺好的

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值