LeetCode 338 (Counting Bits)
思路:
如果已知0到2^k - 1之间的所有数的比特计数,那么2^k到2^(k+1) - 1之间的所有数的比特计数就可以推导出来:bit [ i + 2^k ] = bit [ i ] + 1,其中0 <= i < 2^k.
因为bit [ i + 2^k ]的前k位与bit [ i ]相同,只是第k+1位由0变成了1.
如:
0 = 0, 1 = 1,
2 = 10, 3 = 11.
k=0时,bit[1]=bit[0]+1.
k=1时,bit[2]=bit[0]+1, bit[3]=bit[1]+1.
这样一来,只要知道bit[0]=0,那么就可以求出任意一个数的比特计数。
代码:
class Solution:
def countBits(self, num):
"""
:type num: int
:rtype: List[int]
"""
if num == 0:
return [0]
ans = [0, 1]
n = 2
while n <= num:
for i in range(0, n):
ans.append(ans[i] + 1)
n <<= 1
return ans[:num + 1]