You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
class Solution {
public boolean isReachable(int targetX, int targetY) {
int gcd = gcd(targetX, targetY);
return Integer.bitCount(gcd) == 1; // gcd & (gcd - 1) == 0
}
private int gcd(int a, int b) {
if (b == 0) return a;
return gcd(b, a % b);
}
}
首先从这道题的原型780. Reaching Points讲起。
这道题如果从sx/sy出发,则时间复杂度完全取决于tx/ty,太大了。所以考虑从tx/ty出发。
那么要明白一个先决条件,tx/ty要变成sx/sy,是通过累加正数形成的,所以有:
sx==tx&&sy==ty
则返回truesx<tx || sy < ty
则返回false接下来,考虑如何处理tx/ty的进程呢?注意到两个变量之间的变化,是通过大的数减去小的一方来实现的,加上目标值sx/sy,所以我们可以直接使用/和%得到sx/sy相同层级的tx/ty,即:以tx举例,假如tx>ty(比如tx=100000,ty=1),那么用
sx/ty
得到sx=k*ty+?
中的k,然后通过tx%ty
填充?
,最后还要考虑循环的情况(比如[9,5,12,8]),如此以来直接得到公式reachingPoints(sx, sy, (sx / ty) * ty + tx % ty == tx ? sx - 1 : (sx / ty) * ty + tx % ty, ty)
。再看这一题。
难点在于,看到这道题的后两个公式,要推出:
所以,关键是找到x和y能否通过变化公式1和2,满足上述条件2。
这道题还有更简便的做法,也是扩展欧几里得公式。因为ax+by=gcd(a,b),所以我们只要找到gcd是否有2的次数即可。
这种解法的原理我还没理解。。看下面讲解悟一下吧。。
这种题型,思路一般是:
Tips:
The text was updated successfully, but these errors were encountered: