首先献上一版错误答案
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:评论区看到一老哥说得挺好的