leetCode 338 比特位计数(位运算,dp)

该博客介绍了如何使用动态规划解决一个计算机科学问题,即计算从0到给定非负整数n的所有数字的二进制表达中1的个数。通过位运算和动态规划数组dp,可以高效地得出每个数字的二进制1的计数。代码中展示了具体的实现细节,包括如何更新dp数组,以及如何根据二进制的最后一位判断1的数量变化。

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

题目链接:点击查看

题目描述:

给定一个非负整数 n ,求从 0 n 的所有数字的二进制表达中,分别有多少个 1
 
输入输出:
 
输入: 2
输出: [0,1,1]
输入: 5
输出: [0,1,1,2,1,2]

题目分析:

本题可以利用动态规划和位运算进行快速的求解。定义一个数组 dp ,其中 dp[i] 表示数字 i 的二进制含有 1 的个数。对于第 i 个数字,如果它二进制的最后一位为 1 ,那么它含有 1 的个数则为 dp[i-1] + 1 ;如果它二进制的最后一位为 0 ,那么它含有 1 的个数和其算术右移结果相同,即dp[i>> 1]
 
代码:
vector<int> countBits(int num) 
{
  vector<int>dp(num+1,0);
  for(int i=1;i<=num;++i)
  {
  	 dp[i]=i&1?dp[i-1]+1:dp[i>>1];// 等价于dp[i] = dp[i&(i-1)] + 1;
  }                               //若二进制数以1结尾 相比于前一个数字 它的1的个数增加了1 即dp[i-1]+1(二进制特点) 
                                  //  若二进制数以0结尾 将其右移一位 即末尾0消失 但其1的个数不变 即dp[i]=dp[i>>1] 
  return dp; 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在森林中麋了鹿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值