LC338. 比特位计数(一维动态规划(位运算)-奇偶讨论-简单)

LC338. 比特位计数

题目:给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。
分析:
        让我们先列一下一串数字找一下规律
        0   1   2   3   4   5   6   7
        000 001 010 011 100 101 110 111

        对于所有的奇数:    其二进制表示一定比前面的那个偶数多一个1
                        0   1       2   3       4   5       6   7
                        000 001     010 011     100 101      110 111
                        (0  1)     (1  2)     (1  2)      (2  3)
        对于所有的偶数:    右移一位的 1的个数和 原值 相等  因为右移的一位是 0
                          2        4    |  3       6
                         010      100   |  011    110
                          1        1    |   2      2

       可以用一维动态规划的思想
        状态:  d[i]代表数字i的二进制数中的1的个数
        状态转移方程: d[i] = d[i-1] +1    i为奇数
                                        = d[i/2]       i为偶数
        初始状态:   d[0] = 0

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

def countBits(n):
    d = [0] * (n+1)
    for i in range(1, n+1):
        d[i] = d[i//2] if i % 2 == 0 else d[i-1] + 1
    return d

路虽远,行则将至。事虽难,做则必成 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值