题目描述
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]
.
解题思路
一般的思路,为每一个数求出二进制,是‘1’则对应的计数器加一。但是我估计应该会超时。由于刚学过动态规划,我就想能不能往那边靠。动态规划的思想就是,把大问题变成小问题,而这个小问题你在前面已经解决而且被记录下了结果(一般是一个数组)。加上,一说到二进制,自然会想到不断地模2。于是,开始找规律,找到大数和小数二进制的关系。(关系如下图)
代码如下
class Solution {
public:
vector<int> countBits(int num) {
if (num == 0)
return vector<int>(1, 0);
vector<int> re(num+1, 0);
re[1] = 1;
for (int i = 1; i <= num; i++) {
int tmp = i;
int count = 0;
while (re[tmp] == 0) {
if (tmp == 0)
break;
tmp % 2 == 0 ? count + 0 : count++;
tmp /= 2;
}
re[i] = re[tmp] + count;
}
return re;
}
};