1.题目
给你一个整数 n
,对于 0 <= i <= n
中的每个 i
,计算其二进制表示中 1
的个数 ,返回一个长度为 n + 1
的数组 ans
作为答案。
2.示例
示例 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
提示:
0 <= n <= 105
3.思路
这题我们可以用动态规划的方法来解决,对于动态规划问题我们可以多列几个例子来找到它们之间的规律,通过示例的结果我们可以发现以下规律:
如果k为奇数的时候,那么
如果k为偶数的时候,那么
根据上面的状态转移公式我们逐一计算每个数的比特位个数并加入数组,最终返回结果即可。
公式推导过程
对于二进制数的‘1’的数量,如果这个数是偶数,那么它的最低位肯定是0,因此这个偶数加1后的奇数的‘1’的数量是为。
对于偶数的公式来说,它这个二进制数是它的1/2的二进制数位左移1位补0得到的,例如
5:101 -> 10: 1010
2:10 -> 4: 100
3:11 -> 6: 110
因此偶数的‘1’的数量是
。
4.代码
class Solution:
def countBits(self, n: int) -> List[int]:
bits = [0 for i in range(n+1)]
for i in range(1,n+1):
if i % 2 == 0:
bits[i] = bits[i//2]
else:
bits[i] = bits[i-1] + 1
return bits