338. 比特位计数
分析
-
状态定义
- 定义
f[i]
:表示数字i
的二进制表示中1
的个数
- 定义
-
状态转移
- 将数字
i
右移一位(即i >> 1
),相当于去掉最低位的二进制位 - 数字
i
中的1
的个数可以表示为:f[i] = f[i >> 1] + (i & 1)
f[i >> 1]
:前一个数字中1
的个数i & 1
:判断最低位是否为1
(若最低位为1
,加1
;否则加0
)
- 将数字
-
初始状态
f[0] = 0
:数字0
的二进制表示中没有1
时间复杂度
- 遍历从
1
到n
的所有数字,动态规划计算f[i]
- 每次计算的复杂度为
O(1)
,总复杂度为O(n)
空间复杂度
空间复杂度为 O(n)
C++代码
|
|