classSolution { public: boolreachingPoints(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) { returntrue; } elseif (tx == sx) { return ty > sy && (ty - sy) % tx == 0; } elseif (ty == sy) { return tx > sx && (tx - sx) % ty == 0; } else { returnfalse; } } };
[sol1-C]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
boolreachingPoints(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) { returntrue; } elseif (tx == sx) { return ty > sy && (ty - sy) % tx == 0; } elseif (ty == sy) { return tx > sx && (tx - sx) % ty == 0; } else { returnfalse; } }
[sol1-JavaScript]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
var reachingPoints = function(sx, sy, tx, ty) { while (tx > sx && ty > sy && tx != ty) { if (tx > ty) { tx %= ty; } else { ty %= tx; } } if (tx === sx && ty === sy) { returntrue; } elseif (tx === sx) { return ty > sy && (ty - sy) % tx === 0; } elseif (ty === sy) { return tx > sx && (tx - sx) % ty === 0; } else { returnfalse; } };
[sol1-Golang]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
funcreachingPoints(sx, sy, tx, ty int)bool { for tx > sx && ty > sy && tx != ty { if tx > ty { tx %= ty } else { ty %= tx } } switch { case tx == sx && ty == sy: returntrue case tx == sx: return ty > sy && (ty-sy)%tx == 0 case ty == sy: return tx > sx && (tx-sx)%ty == 0 default: returnfalse } }
复杂度分析
时间复杂度:O(\log \max(\textit{tx}, \textit{ty})),其中 tx 和 ty 是终点值。反向计算的过程与辗转相除法相似,时间复杂度是 O(\log \max(\textit{tx}, \textit{ty}))。