leetcode 338. Counting Bits
Problem
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 1:
Input: 2
Output: [0,1,1]
Example 2:
Input: 5
Output: [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.
Solutions
1.Dynamic Programming
For this problem, i’d like to use dynamic programming to solve uh, we can use all the digits except the highest digit to do this, because the value of current position equals to the value of all the digits except the highest digit add 1.
class Solution {
public int[] countBits(int num) {
if(num == 0) return new int[]{0};
if(num == 1) return new int[]{0,1};
int[] res = new int[num + 1];
res[0] = 0;
res[1] = 1;
int mask = 0;
int digit = 0;
for(int i = 2; i < num + 1; i++){
if((i & (i - 1)) == 0){
mask = (mask << 1) | 1;
res[i] = 1;
}else{
res[i] = res[i & mask] + 1;
}
}
return res;
}
}
After reading the answer of other people, I find out an easier way to solve this actually we can only care about the right most digit of the binary.
class Solution {
public int[] countBits(int num) {
int[] res = new int[num + 1];
for(int i = 0; i < num + 1; i++){
res[i] = res[i >> 1] + (i & 1);
}
return res;
}
}