思路
正常想法是对每个数都进行计算。
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; } };
|
近期评论