leetcode:338. 比特位计数

题目来源

题目描述

在这里插入图片描述

题目解析

二进制表示算法:

  • 第一步: i mod 2 是最低位的bit
  • 第二步: i <- floor(i/2),如果i = 0,结束;否则回到第一步

序列+位操作型动态规划

(1) 确定状态

  • 观察一个数的二进制位:
    • ( 170 ) 10 = ( 10101010 ) 2 (170)_{10} = (10101010)_2 (170)10=(10101010)2
    • 最后一步:观察这个数最后一个二进制位(最低位),去掉它,看剩下多少个1
      • ( 170 ) 10 = ( 10101010 ) 2 (170)_{10} = (10101010)_2 (170)10=(10101010)2,有4个1
      • ( 85 = 170 / 2 ) 10 = ( 1010101 ) 2 (85=170/2)_{10} = (1010101)_2 (85=170/2)10=(1010101)2,有4个1
  • 子问题:
    • 原问题:要求N的二进制表示中有多少个1
    • 子问题:在N的二进制去掉最后一位N mod 2 ,设新的数是Y=(X >> 1)(右移一位),要知道Y的二进制表示中有多少1
  • 状态:
    • f[i]:设f[i]表示i的二进制表示中有多少个1

(2) 转移方程

在这里插入图片描述
(3) 初始条件和边界情况

  • 初始条件:f[0] = 0

(4) 计算顺序

  • 从小到大 f[0]…f[N]
  • 返回值f

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值