338. 比特位计数(Counting Bits)

本文深入解析了338.比特位计数(Counting Bits)问题,利用二进制的特性,提出了动态规划的解题思路,并详细分析了其时间与空间复杂度。通过实例说明了奇数和偶数二进制1的个数的规律,给出了Python代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

338. 比特位计数(Counting Bits)

题解

本题主要考察二进制的自身特性。
二进制的两个特性:

  1. 奇数的二进制中1的个数=它上一位偶数的二进制中1的个数+1
    如: ( 3 ) 10 = ( 11 ) 2 , ( 2 ) 10 = ( 10 ) 2 (3)_{10}=(11)_{2},(2)_{10}=(10)_{2} (3)10=(11)2,(2)10=(10)2
    ( 13 ) 10 = ( 1101 ) 2 , ( 12 ) 10 = ( 1100 ) 2 (13)_{10}=(1101)_{2},(12)_{10}=(1100)_{2} (13)10=(1101)2,(12)10=(1100)2
  2. 偶数中二进制1的个数等于这个偶数除以2后的数二进制1的个数。
    解释:位运算 < < << <<,表示将当前数乘以2,即在二进制的最右侧加个0。
    如: ( 10 ) 10 = ( 1010 ) 2 (10)_{10}=(1010)_{2} (10)10=(1010)2 ( 1010 ) 2 < < 1 = ( 10100 ) 2 = ( 20 ) 10 (1010)_{2}<<1=(10100)_{2}=(20)_{10} (1010)2<<1=(10100)2=(20)10
    反过来,可以得到上述结论。

动态规划

由二进制的两条性质得到递推公式:
d p [ i ] = { d p [ i − 1 ] + 1 i 为 奇 数 d p [ i / / 2 ] i 为 偶 数 dp[i]=\left\{\begin{array}{ll}{dp[i-1]+1} & {i为奇数} \\ {dp[i//2]} & {i为偶数}\end{array}\right. dp[i]={dp[i1]+1dp[i//2]ii

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)

Python

class Solution:
    def countBits(self, num: int) -> List[int]:
        dp=[0]*(num+1)
        for i in range(1,num+1):
            if(i%2==1):
                dp[i]=dp[i-1]+1
            else:
                dp[i]=dp[i//2]
        return dp

Java(待完成)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值