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.
我的代码:
class Solution {
public:
vector<int> countBits(int num) {
vector<int> results;
results.push_back (0);
results.push_back (1);
if(num<2){
results.resize(num+1);
return results;
}
for(int i=2;i<num+1;i++){
switch(i%2){
case 0: {
results.push_back (results.at(i/2));
break;
}
case 1: {
results.push_back (results.at(i-1)+1);
break;
}
}
}
return results;
}
};
代码思想是很简单的
我们将数字分成奇数和偶数考虑
1:如果一个数n是奇数,那么它的二进制表示所含的1的数量为与其相邻的上一个偶数的1的数量+1
2:如果一个数n是偶数,那么它的1的数量肯定等于将其自身右移一位所组成的偶数的1的数量,也就是和n/2所含的1的数量是一致的
所以这道题就是简单的Dp题目啦
该解法空间复杂度为O(n).因为输出的向量大小就是等于n的大小
时间复杂度为O(n),因为循环是n次