- 描述: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].
- 分析:这道题从pass起来非常容易,但是关键在与如何设计出是件复杂度为O(n)的算法。
- 思路一:直接使用循环暴力求解。O(n*sizeof(integer))
class Solution {
public:
vector<int> countBits(int num) {
vector<int> my_vec;
for (int i = 0; i <= num; i++) {
my_vec.push_back(count_num(i));
}
return my_vec;
}
int count_num(int num) {
int count = 0;
int find_num = 0;
while (num != 0) {
find_num = num % 2;
if (find_num == 1) {
count++;
}
num = num / 2;
}
return count;
}
};
- 思路二:使用动态规划的思想求解。(O(n))
十进制 | 二进制 |
---|---|
0 | 000 |
1 | 001 |
2 | 010 |
3 | 011 |
4 | 100 |
5 | 101 |
6 | 110 |
7 | 111 |
… | … |
对于这些二进制的值,先出现的二进制会在后出现的二进制中被利用,因此我们在计算中只需要将利用前面统计出来的结果加上最低位的1就可以完成。
class Solution {
public:
vector<int> countBits(int num) {
vector<int> my_vec(num + 1, 0);
for (int i = 1; i <= num; i++) {
my_vec[i] = my_vec[i >> 1] + i % 2;
}
return my_vec;
}
};