题目:给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。
分析:
让我们先列一下一串数字找一下规律
0 1 2 3 4 5 6 7
000 001 010 011 100 101 110 111
对于所有的奇数: 其二进制表示一定比前面的那个偶数多一个1
0 1 2 3 4 5 6 7
000 001 010 011 100 101 110 111
(0 1) (1 2) (1 2) (2 3)
对于所有的偶数: 右移一位的 1的个数和 原值 相等 因为右移的一位是 0
2 4 | 3 6
010 100 | 011 110
1 1 | 2 2
可以用一维动态规划的思想
状态: d[i]代表数字i的二进制数中的1的个数
状态转移方程: d[i] = d[i-1] +1 i为奇数
= d[i/2] i为偶数
初始状态: d[0] = 0
复杂度: 时间复杂度O(n) 空间复杂度O(n)
def countBits(n):
d = [0] * (n+1)
for i in range(1, n+1):
d[i] = d[i//2] if i % 2 == 0 else d[i-1] + 1
return d