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++代码
|
|