标签:
Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of all numbers in this range, inclusive. For example, given the range [5, 7], you should return 4.
Analysis: O(N) solution will cause TLE, so this is a math problem and should generate O(1) solution
First trial: slow.
Check all 32 bits. see if both m(lower bound) and n(higher bound) are 1 on ith bit. Also need to check if diff=n-m+1 is greater than 2^i, which is the max range that 1 is fixed on this bit.
1 public class Solution { 2 public int rangeBitwiseAnd(int m, int n) { 3 int res = 0; 4 int diff = n-m+1; 5 int maxRange = 1; 6 for (int i=0; i<=31; i++) { 7 maxRange = (int)Math.pow(2, i); 8 if (diff > maxRange) continue; 9 int mi = (m>>i) & 1; 10 int ni = (n>>i) & 1; 11 if (mi == 1 && ni == 1) res |= 1<<i; 12 } 13 return res; 14 } 15 }
Better solution: this is actually finding the Shared Header(公共头部)
1 public class Solution { 2 public int rangeBitwiseAnd(int m, int n) { 3 if (m > n) return 0; 4 int i = 0; 5 while (m != n && m != 0) { 6 m = m >> 1; 7 n = n >> 1; 8 i++; 9 } 10 return m<<i; 11 } 12 }
Leetcode: Bitwise AND of Numbers Range
标签:
原文地址:http://www.cnblogs.com/EdwardLiu/p/5047008.html