题目
给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。
示例
示例 1:
输入: 2
输出: [0,1,1]
示例 2:
输入: 5
输出: [0,1,1,2,1,2]
// 时间复杂度为O(n * sizeof(integer))
int count=0;
vector<int> dp(num+1,0);
for(int i=0;i<num+1;i++){
int j=i;
int count=0;
while(j){
if(j&1)
count++;
j=j>>1;
}
dp[i]=count;
}
return dp;
// 线性时间O(n)
vector<int> dp(num + 1, 0);
for (int i = 1;i <= num;i++) {
//将整数 - 1 与其本身做位与运算,相当于将其最右边的 1 变成 0
//代码中 res[i] 为 i 中 1 的个数,也就是res[i&(i-1)] 为 i & (i - 1) 中 1 的个数再 + 1。
// 我们可以看到,如果整数最右边的 1 变成了 0,无论如何,它都是减少的。 即,我们是拿前面的数来算后面的数,
dp[i] = dp[i&i - 1] + 1;
}
return dp;