前言
通过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

这篇博客记录了作者使用LeetCode平台进行每日刷题的过程,重点解析了题目‘剑指OfferII003.前n个数字二进制中1的个数’。博主分享了两种解题方法,包括平民做法和Brian Kernighan算法,详细解释了算法思路并提供了Python代码实现。
&spm=1001.2101.3001.5002&articleId=126443364&d=1&t=3&u=92e832194f394ad397f0e18bbf42d764)
492

被折叠的 条评论
为什么被折叠?



