题目描述:
给你一个整数 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
思路1:
对每一个求一次
class Solution:
def countBits(self, n: int) -> List[int]:
self.result = []
for i in range(n+1):
self.result.append(self.hammingWeight((i)))
return self.result
def hammingWeight(self, n: int) -> int:
count = 0
while n != 0:
count += 1
n = n & (n-1)
return count
时间复杂度较高。
思路2:
类似于递推的思想:
i的1的位数是,i除去最低位1 之后变成的数的1 的数量,再加上1。
class Solution:
def countBits(self, n: int) -> List[int]:
self.result = []
for i in range(n+1):
self.result.append(0)
for i in range(1, n+1):
self.result[i] = self.result[i & (i-1)] + 1
return self.result
时间复杂度为O(n)。