给你一个整数 n
,对于 0 <= i <= n
中的每个 i
,计算其二进制表示中 1
的个数 ,返回一个长度为 n + 1
的数组 ans
作为答案。
示例 1:
输入:n = 2 输出:[0,1,1] 解释: 0 --> 0 1 --> 1 2 --> 10
示例 2:
输入:n = 5 输出:[0,1,1,2,1,2] 解释: 0 --> 0 1 --> 1 2 --> 10 3 --> 11 4 --> 100 5 --> 101
提示:
0 <= n <= 105
实现:
可以使用动态规划的思想解决此问题。设dp[i]表示i的二进制表示中1的个数,那么有以下状态转移方程:
- 当i为偶数时,dp[i]=dp[i//2]
- 当i为奇数时,dp[i]=dp[i-1]+1
因为偶数i的二进制表示中,其最低位是0,所以将i向右移一位(相当于除以2),其二进制表示中1的个数不变,即dp[i]=dp[i//2]。 而当i为奇数时,其二进制表示中最低位为1,所以将i-1(相当于将其最低位的1变为0),其二进制表示中1的个数会减少1,即dp[i]=dp[i-1]+1。
以下是Python的实现代码:
1 2 3 4 5 6 7 8 9 | class Solution: def countBits( self , n: int ) - > List [ int ]: dp = [ 0 ] * (n + 1 ) for i in range ( 1 , n + 1 ): if i % 2 = = 0 : dp[i] = dp[i / / 2 ] else : dp[i] = dp[i - 1 ] + 1 return dp |
时间复杂度:O(n)
标签:
python
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧