counting bits

思路

正常想法是对每个数都进行计算。

1
2
3
4
5
6
7
8
9
for (int i = 0; i <= num; i++) {
int count = 0;
int value = i;
while (value) {
count += value % 2;
value >>= 1;
}
vec[i] = count;
}

显然时间复杂度:O(n*sizeof(i))
但是转换思路,一个数的1的个数可以表示为最后一位是否为1以及其他位的1的个数。

1
2
3
4
5
6
7
8
9
10
11
class {
public:
vector<int> countBits(int num) {
vector<int> vec(num + 1, 0);
for (int i = 1; i <= num; i++) {
vec[i] = vec[i>>1] + i%2;
cout << vec[i] << " " << vec[i >> 1] << endl;
}
return vec;
}
};