338. Counting Bits

Question

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).

Thinking:

  • Method 1:
    • 遍历所有的数,对于每一个数字都计算一遍。
class Solution {
    public int[] countBits(int num) {
        int[] res = new int[num + 1];
        for(int i = 0; i <= num; i++)
            res[i] = check(i);
        return res;
    }
    private int check(int n){
        int res = 0;
        while(n != 0){
            if((n & 1) == 1) res++;
            n >>= 1;
        }
        return res;
    }
}
  • Method 2:
    • 思考如何使用已经得出的结果,使用dp。
      • 如果num % 2 == 0, 就说明dp[num] = dp[num / 2],只是单纯的移动了1的位置而已;
      • 如果num % 2 != 0, 说明有新的1出现了。所以dp[num] = dp[num / 2] + 1;
class Solution {
    public int[] countBits(int num) {
        int[] res = new int[num + 1];
        for(int i = 1; i <= num; i++){
            if(i % 2 == 0) res[i] = res[i / 2];
            else res[i] = res[i / 2] + 1;
        }
        return res;
    }
}