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:
For `num = 5` you should return [0,1,1,2,1,2].
- 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.
**
Algorithm:
**
根据前面几个例子的观察:
0,1
10,11
101,100
110,111
……
可以看作前面两位+0或1,所以n中1的个数相当于就是(n/2中1的位数+1或0)。
比如101可以看作,10中1的个数+1,而101B/2正好是10。
所以,用F(n)表示n的二进制中1的个数,那么
F(n)=F(n/2)+n%2
同时我们已经知道了F(0),F(1),所以问题解决
**
Code:
**
class Solution {
public:
vector<int> countBits(int num) {
vector<int> v(num+1,0);
for(int i=1;i<=num;i++)
{
v[i]=v[i/2]+i%2;
}
return v;
}
};