难度:中等。
标签:动态规划。
虽然是动态规划,但被我写成找规律了。
将数字的比特位数列举出来,如下:
0 : 0
1 : 1
2 : 1 2
4 : 1 2 2 3
8 : 1 2 2 3 2 3 3 4
16: 1 2 2 3 2 3 3 4 2 3 3 4 3 4 4 5
每一行的前一半与上一行一样,后一半是上一行每个元素加1。
正确解法:
class Solution {
public:
vector<int> countBits(int num) {
vector<int> result;
result.emplace_back(0);
int last_n = 0, n = 1;
for(int i = 1; i <= num; i++){
if(i == 1){
result.emplace_back(1);
continue;
}
if(i == n *2){
last_n = n;
n = 2 * n;
}
if(i < last_n + n){
result.emplace_back(result[last_n + i - n]);
}
else{
result.emplace_back(result[i - n] + 1);
}
}
return result;
}
};
结果: