给你一个整数 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

Method :

分析可知:

            1的个数
0 --> 0000    0
1 --> 0001    1       1&(1-1) = 0000 = 0
2 --> 0010    1       2&(2-1) = 0000 = 0
3 --> 0011    2       3&(3-1) = 0010 = 2
4 --> 0100    1       4&(4-1) = 0000 = 0
5 --> 0101    2       5&(5-1) = 0100 = 4
6 --> 0110    2       6&(6-1) = 0100 = 4
7 --> 0111    3       7&(7-1) = 0110 = 6
8 --> 1000    1       8&(8-1) = 0000 = 0
9 --> 1001    2       9&(9-1) = 1000 = 8

可以看出  i & ( i-1 )  操作会使 i 的二进制数中最后一个 1 消失。

即:数字 i 的二进制数中 1 的个数 = 数字  i & ( i-1 ) 的二进制数中 1 的个数。

因此,我们可以利用发现的这条规律进行比特位计数。

Code:

class Solution
{
public:// 比特位计数vector<int> countBits(int n){// 建立数组存放二进制表示中1的个数// 数组初始化时// (x,y)  x:元素数  y:初始值// {x,y}  初始两个元素: x和yvector<int> count(n+1,0);// 遍历计算二进制表示中1的个数for(int i=1;i<=n;i++){// 利用发现的规律进行比特位计数count[i]=count[i&(i-1)]+1;}// 返回保存比特位计数的数组return count;}
};

进阶:

很容易就能实现时间复杂度为 O(n log n) 的解决方案,你可以在线性时间复杂度 O(n) 内用一趟扫描解决此问题吗?
你能不使用任何内置函数解决此问题吗?(如,C++ 中的 __builtin_popcount )

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/counting-bits

Reference:

C++:vector对象的初始化_Hugh.L的博客-CSDN博客_c++ vector初始化

LeetCode 338. 比特位计数 C++ 位运算_//夜游神的博客-CSDN博客

(LeetCode C++)比特位计数相关推荐

  1. Leetcode 338.比特位计数

    Time: 20190904 Type: Medium 题目描述 给定一个非负整数 num.对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回. ...

  2. leetcode 338. 比特位计数

    给定一个非负整数 num.对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回. 示例 1: 输入: 2 输出: [0,1,1] 示例 2: 输入: ...

  3. LeetCode 231. 2的幂 LeetCode 338. 比特位计数(2进制1的个数)

    文章目录 1. 题目信息 2. 解题 拓展:求一个数n的2进制有多少个1? LeetCode 338 1. 题目信息 给定一个整数,编写一个函数来判断它是否是 2 的幂次方. 示例 1:输入: 1 输 ...

  4. leetcode 338 比特位计数

    如果一个数i%2=1,即为奇数,即二进制中的最低位为1.我们将这个过程循环直至i为0,每一次i%2=1我们将该数的'1'数加一. 上面的方法不能做到复杂度O(n)完成所有数的的遍历.我们换成动态规划. ...

  5. LeetCode 338. 比特位计数(动态规划)

    题目描述 给定一个非负整数 num.对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回. 示例 1: 输入: 2 输出: [0,1,1] 示例 2 ...

  6. 《LeetCode力扣练习》第338题 比特位计数 Java

    <LeetCode力扣练习>第338题 比特位计数 Java 一.资源 题目: 给你一个整数 n ,对于 0 <= i <= n 中的每个 i ,计算其二进制表示中 1 的个数 ...

  7. LeetCode每日一题:比特位计数(No.338)

    题目:比特位计数 给定一个非负整数 num.对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回. 复制代码 示例: 输入: 2 输出: [0,1, ...

  8. Leetcode338. 比特位计数

    Leetcode338. 比特位计数 题目: 给你一个整数 n ,对于 0 <= i <= n 中的每个 i ,计算其二进制表示中 1 的个数 ,返回一个长度为 n + 1 的数组 ans ...

  9. 比特位计数--C++ bitset 用法

    比特位计数 前言 一.示例 二.代码解析 1.比特位计数 2.测试代码 3.结果 三.C++ bitset 用法 1.构造函数 2.一些函数 3.结果 总结 前言 给定一个非负整数 num.对于 0 ...

最新文章

  1. css实现一个写信的格式
  2. phpbreak跳出几层循环_4.2.5 PHP break语句跳出循环
  3. 解决jodconverter 2.2.1 版本不支持docx、xlsx、pptx 转换成PDF格式异常
  4. Python框架篇之Django(Models数据表的创建、数据库配置)
  5. Linux 后台开发运维人员常用的Linux命令汇总
  6. 离线安装老版本android sdk,亲测,linux、windows、mac通用
  7. 斯坦福与苹果基于Apple Watch检测心率异常,0.5%人群被检出,其中84%患有房颤...
  8. cadz轴归零命令_CAD的Z轴归零的插件分享
  9. IEEE1588精确网络时钟同步协议简介
  10. 我喜欢计算机作文450字,我喜欢的一种游戏作文450字(精选8篇)
  11. C++ | (struct)结构体变量作为函数参数调用的方法小结
  12. Java聊天室系统(三):图形界面窗口展示
  13. java profiler 工具_(转)Java应用性能分析工具:async-profiler
  14. MySQL —— 14、触发器
  15. 《封号码罗》python爬虫之企某科技网站js逆向(十四)
  16. c语言用break语句提前结束循环,break语句C语言程序设计.pdf
  17. linux命令jvs,Linux程序员Jvs称Windows毁灭之神几乎没法做到
  18. 锐龙r5 6600u和r5 5600u区别 r56600u和r55600u对比
  19. dna计算机原理和基本特征,DNA计算机原理(Ⅲ)
  20. Web安全之CTF测试赛

热门文章

  1. 过来人谈《去360还是留在百度?》(转)
  2. RF 执行测试用例的命令
  3. php实现ddns,动态域名DDNS实现
  4. TDengine在黑格智造的落地应用
  5. java引入包_java如何导入包
  6. Python ssh 远程执行shell命令
  7. 恒成立问题的必要性加充分性证明
  8. 【全栈计划 —— 单片机】——Part_04 IO口输入功能的使用
  9. tcpreplay 回放报文
  10. Unity 之刚体,碰撞体,触碰器