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

# Solution

Approach 1: Identify the rule.

# Code (Python)

Approach 1:

# Code (C++)

Approach 1:

class Solution {
public:
    vector<int> countBits(int num) {
        vector<int> res;
        if (num >= 0) res.push_back(0);
        if (num >= 1) res.push_back(1);
        int base = 2;
        int i = 0;
        for (int n = 2; n <= num; ++n)
        {
            if (i == base)
            {
                i = 0;
                base *= 2;
            }
            res.push_back(res[i] + 1);
            i++;
        }
        return res;
    }
};

class Solution {
public:
    vector<int> countBits(int num) {
        vector<int> res;
        res.push_back(0);
        for (int i = 1; i <= num; ++i) {
            
// option 1
//            int j = i - (i & -i);  // or int j = i & (i - 1);
//            res.push_back(res[j] + 1);

// option 2
            res.push_back(res[i>>1] + (i & 1));
            
        }
        return res;
    }
};