题目:
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.
分析:
这道题目的意思是要得到0~num中每个数字的二进制中‘1’的个数。由于这道题对时间复杂度的要求为O(n),所以使用动态规划来求解。
状态转移方程为result[i] = result[i-n]+1(n为小于i的最大的2的幂) 。
代码:
class Solution {
public:
vector<int> countBits(int num) {
vector<int> result;
int temp;
int pp = 1;
if(num == 0)
result.push_back(0);
if(num == 1||num>1)
{
result.push_back(0);
result.push_back(1);
}
for(int i = 2;i<=num;i++)
{
temp = i-pow(2,pp);
if(temp == pow(2,pp))
{
temp = 0;
pp++;
}
result.push_back(result[temp]+1);
}
return result;
}
};