前言
通过leetcode记录自己每天坚持刷题,以此监督自己的学习。不能放假了就懈怠😁
题目简介
题目传送地:剑指 Offer II 003. 前 n 个数字二进制中 1 的个数
给定一个非负整数 n ,请计算 0 到 n 之间的每个数字的二进制表示中 1 的个数,并输出一个数组。
示例 1:
输入: n = 2
输出: [0,1,1]
解释: 0 --> 0 1 --> 1 2 --> 10
解析
这个题主要核心的思想Brian Kernighan 算法就是判断一个数二进制中1的个数应当通过
n&=n(-1)
每次进行这一操作1就会少一个以此就可以计算出1的个数
但是官解,,太秀了,我这就平民做法
代码
- v1
class Solution:
def countBits(self, n: int) -> List[int]:
bits = [0]
for i in range(1,n+1):
temp=0
while i!=0:
i&=(i-1)
temp+=1
bits.append(temp)
return bits
- v2:动态规划+Brian Kernighan 算法
class Solution:
def countBits(self, n: int) -> List[int]:
bits = [0]
highBit = 0
for i in range(1, n + 1):
if i & (i - 1) == 0:
highBit = i
bits.append(bits[i - highBit] + 1)
return bits