题意:用O(n)的复杂度求出[0, n]内所有数的1的数量。
思路:假设每个数的二进制表示中有num[i]个1,现在有一个数k,k-1二进制表示中最右有p个连续的1,现在将k-1加一,那么这连续的p个1会变成0,而且第p+1位会变成1,也就是说我们得到了一个递推式,num[i] = num[i-1] + 1 - p。
现在的问题就是求p,可以用unordered_map存储一个映射,二进制表示为p个连续的1数的十进制映射到p,这个预处理一下即可。
class Solution {
public:
vector<int> countBits(int num) {
unordered_map<int, int> um;
vector<int> ans;
for (int i = 1, j = 0; i < (1<<30); i<<=1)
um[i-1] = j++;
ans.push_back(0);
for (int i = 1; i <= num; i++) {
int ones = (i^(i-1)) >> 1;
ans.push_back(ans[i-1]+1-um[ones]);
}
return ans;
}
};