题目
给定一个非负整数 n ,请计算 0 到 n 之间的每个数字的二进制表示中 1 的个数,并输出一个数组。
示例 1:
输入: n = 2
输出: [0,1,1]
解释:
0 --> 0
1 --> 1
2 --> 10
题解
- 题解一
本体最直观的想法是,求每个数的二进制位个数,如下:`
int count_1(int n)
{
int index = 1, res = 0;
while (n > 0)
{
//将n的最后一位1置0
n &= (n - 1);
res++;
}
return res;
}
vector<int> countBits(int n) {
vector<int> res(n+1);
for(int i = 0; i <= n; ++i)
res[i] = count_1(i);
return res;
}
时间复杂度n*logn
- 题解二 动归思路,参考力扣官方题解
// leecode官方题解 最低设置位
// 最低设置位定义为整数x的最低为1的位置 如10(1010)的最低设置位为2
// 令y = x & (x - 1),则y变为1000,相当于将x的最低设置位置0
// 可以发现 x的比特位比y大一,且x > y,由此推出等式 bits[i] = bits[i & (i - 1)] + 1;
vector<int> countBits(int n) {
vector<int> bits(n + 1);
for (int i = 1; i <= n; i++) {
bits[i] = bits[i & (i - 1)] + 1;
}
return bits;
}