问题陈述:
您将获得两个非负整数:longs pairOr和pairSum。
确定两个非负整数A和B是否可能同时具有:
在上面,“或”表示按位或运算符。
如果我们能找到这样的A和B,则返回True,否则返回False。
我的算法是这样的:
我采用了等式:A | B = X且A + B = Y,
现在从第二个等式中取代A的值后,(Y-B)| B = X。
我将从0到Y(代替B)遍历以检查上述等式是否为真。
代码段:
boolean isPossible(long orAandB,long plusAandB) {
for(long i=0;i<=plusAandB;i++) {
if(((plusAandB-i)|i)==orAandB ){
return true;
}
}
return false;
如果plusAndB的值为10^18
,则会给出TLE。你能帮我优化吗?
答案 0 :(得分:1)
你不需要完整的迭代,给出O(N)。有一种方法可以在O(logN)中完成。
但是完全解决这个问题会带走大部分的乐趣... ;-),所以这里是主线索:
您的等式(Y-B) | B= X
是一个很好的观察,第二个是从右边开始一点一点地看一下这个等式(所以你不必担心借位第一名)。哪个Y,X和B的最后一位组合可以使你的方程成立?如果你找到一个B位,你怎么用高位继续递归(不要忘记减法可能需要借用)?我希望你能记住减去二进制数的规则。
请记住,问题只是要求真或假,而不是任何特定的A或B值,可以为您节省指数的复杂性。