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.
这又是一道二进制的题目,需要使用n线性复杂度的算法,想了一下,应该是需要动态规划的方法来依次输出结果。其实写几个数的二进制表达式就很明显了。因为二进制每增加一位,增加的数的个数正好是这个数以前所有数的个数。我们这么理解,意思就是在这个数之前所有的数的二进制表达式前加上一个1,恰好是接下来2^的j次方数的二进制表达式。所以我们就有了一种动态规划的思路:
class Solution {
public:
vector<int> countBits(int num) {
vector<int> result(num+1);
result[0] = 0;
result[1] = 1;
for(int i =2,j=1;i<=num;++i)
{
int k = pow(2,j);
if(i<pow(2,j))
result[i] = result[i-k/2]+1;
else if(i == k)
{
result[i] = 1;
j++;
}
}
return result;
}
};