#338
Easy
位运算

Counting Bits

统计 0 到 n 每个数字的二进制 1 的个数。

Bit ManipulationDP

题目定位

它很好地连接了 DP 和位技巧,因为每个答案都能在去掉最低位 1 之后复用更小数字的结果。

关键观察

最经典的转移是 bits[i] = bits[i & (i - 1)] + 1。

目标复杂度

O(n) / O(n)

这题的解法思路怎么拆

1

它很好地连接了 DP 和位技巧,因为每个答案都能在去掉最低位 1 之后复用更小数字的结果。

2

最经典的转移是 bits[i] = bits[i & (i - 1)] + 1。

3

先定义每一位的语义。

4

选一个最自然的位操作来更新该语义。

参考实现

Python
# Generic pattern template
x & (x - 1)        # clear lowest set bit
x & -x             # isolate lowest set bit
x | (1 << i)       # set bit i
x & ~(1 << i)      # clear bit i
x ^ (1 << i)       # toggle bit i
(x >> i) & 1       # read bit i

常见坑点

warning

把每个数字都独立暴力处理,没意识到有递推关系。

warning

不理解 i & (i - 1) 为什么能去掉最低位 1。

高频追问

还有没有基于右移的另一种转移?

为什么它既算 DP 又算位运算?

继续刷相关题

先把 位运算 这个模式刷成体系,再去做更难变体。

view_week回到模式页
LeetCode 338. Counting Bits 题解思路 | Interview AiBox