7.エンドポイントに到達します
7.1。タイトルの要件
4つの整数sx、sy、tx、およびtyが与えられた場合、一連の遷移を介して開始点(sx、sy)から終了点(tx、ty)に到達できる場合はtrueを返し、そうでない場合はfalseを返します。ポイント(x、y)から、(x、x + y)または(x + y、y)に変換できます。
示例 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
ソース:LeetCode
リンク:https ://leetcode-cn.com/problems/reaching-points
7.2.問題解決のアイデア
この質問では、逆推論操作を使用します。最初に(tx、ty)で逆操作を実行し、逆操作を実行できなくなるまで(最終的には(sx、sy)の次の状態にプッシュされます)、次のことができます。次のステップの操作に進み、上記の結論と(sx、sy)から導き出された状態を計算して判断し、ブール値を取得します。
7.3。アルゴリズム
class Solution {
public boolean reachingPoints(int sx, int sy, int tx, int ty) {
//将(tx,ty)进行反向操作,直到无法进行反向操作,就可以进行下一步
//最终将会推至(sx,sy)的下一个状态
while(tx > sx && ty > sy && tx != ty){
if(tx > ty)
//上一个状态为(tx - ty,ty)
tx %= ty;
else
//上一个状态为(tx,ty - tx)
ty %= tx;
}
//将上述结论推出的状态与(sx,sy)进行计算与判断,得出boolean值
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;
}
}
}