题目描述:
给你一个整数 n
,对于 0 <= i <= n
中的每个 i
,计算其二进制表示中 1
的个数 ,返回一个长度为 n + 1
的数组 ans
作为答案。
示例 1:
输入:n = 2
输出:[0,1,1]
解释:
0 --> 0
1 --> 1
2 --> 10
示例 2:
输入:n = 5
输出:[0,1,1,2,1,2]
解释:
0 --> 0
1 --> 1
2 --> 10
3 --> 11
4 --> 100
5 --> 101
方法一:数字分析(C++代码)
分析:对于 0 ~ n 的所有数字,无非就是两种:奇数和偶数。
①奇数:在二进制表示中,其一定比前面的偶数多一个 1,且这个 1 就是最低位的 1。
(例如:0——0,1——1;2——10,3——11;4——100,5——101)
②偶数:在二进制表示中,其一定和除以 2 之后的数所含 1 的个数相等。因为偶数的二进制表示最后一位一定是 0,除以 2 就相当于右移一位,正好把最低位的 0 抹掉,1 的个数不变。
(例如:2——10,4——100,8——1000)
最后,0 的 1 个数是 0,因此可根据此性质开始循环遍历。
class Solution {
public:
vector<int> countBits(int n) {
vector<int> result(n + 1);
result[0] = 0; //0的1位数为0
for(int i = 1; i <= n; i++){
if(i % 2 == 1){ //奇数:前面的偶数+1
result[i] = result[i - 1] + 1;
}else{ //偶数:和除以2之后的数1的位数相等
result[i] = result[i / 2];
}
}
return result;
}
};
时间复杂度:O(n);
空间复杂度:O(1),除了返回的数组以外,空间复杂度为常数。