思考过程:
如果逐个计算,数量级较大(虽然只是O(n),但是本题中的n会很大,所以最终的效率依然不高),然后观察数想与的过程中,容易得到结果0,而0再与依然是0,所以逐个计算,得到0后立即返回0,这是否内提高效率呢?
代码实现:
public int rangeBitwiseAnd(int m, int n) {
if (m == n) {
return n;
}
int left = m;
for (int right = left + 1; right <= n; ) {
left = left & right;
if (left == 0) {
return 0;
}
if (right < Integer.MAX_VALUE) {
right++;
}
if (right == Integer.MAX_VALUE) {
break;
}
}
return left;
}
执行结果未通过。
此思路在部分情况下有所效果,但是依然存在需要计算n次,而且n很大的情况,复杂度并没有提升。思考无果。
把复杂的与问题,转换成找两个数的公共前缀问题,使得问题得到简化。
官方代码:
public int rangeBitwiseAnd(int m, int n) {
int shift = 0;
// 找到公共前缀
while (m < n) {
m >>= 1;
n >>= 1;
++shift;
}
return m << shift;
}
总结:
发现当前思路无法解答问题时,需要从更多的角度去考虑问题,才有可能找到合适的方法。