338 Counting Bits
Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num calculate the number of 1's in their binary representation and return them as an array.
Example:
For num = 5 you should return [0,1,1,2,1,2].
Follow up:
- It is very easy to come up with a solution with run time O(n*sizeof(integer)). But can you do it in linear time O(n) /possibly in a single pass?
- Space complexity should be O(n).
- Can you do it like a boss? Do it without using any builtin function like __builtin_popcount in c++ or in any other language.
Solution
class Solution {
public:
vector<int> countBits(int num) {
vector<int> result;
if ( num <= -1 ) return result;
result.push_back(0);
if ( num == 0 ) return result;
for ( int i = 1; i <= num; i++ ) {
if ( i%2 == 0 ) result.push_back(result[i/2]);
else result.push_back(result[(i-1)/2] + 1);
}
return result;
}
};
Notes
- for an even number i, the number of digit 1 is the same as in (i/2)
- e.g. 14 (1110) vs. 7 (111)
- for an odd number i, the number of digit 1 equals to the number of digit one in (i-1)/2 plus one.
- e.g. 15 (1111) vs. 7(111)