比特位计数(leetcode-338)
题目
给定一个非负整数\(num\)。对于\(0 \leq i \leq num\)范围中的每个数字 \(i\),计算其二进制数中的 \(1\) 的数目并将它们作为数组返回。
示例 1:
输入: 2
输出: [0,1,1]
示例 2:
输入: 5
输出: [0,1,1,2,1,2]
思路
动态规划。题目要求O(n),很显然第一反应递推。假设\(f(n)\)为数字n的二进制形式中\(1\)的个数,那么我们需要找\(f(n)与f(0),f(1)...f(n-1)\)的关系。从二进制可以看出
0:000
1:001
2:010
3:011
如果一个数能被2整除,那么\(f(n)=f(n//2)\);如果一个数不能被2整除,那么\(f(n) = f(n-1)+1\)
这就是递推关系。
代码
class Solution:
def countBits(self, num: int) -> list:
dp = [0] # 保存结果
for i in range(1, num + 1):
if i % 2 == 0:
dp.append(dp[i // 2])
else:
dp.append(dp[i - 1] + 1)
return dp

浙公网安备 33010602011771号