算法题每日一练---第42天:比特位计数

简介: 给你一个整数 n ,对于 0 <= i <= n 中的每个 i ,计算其二进制表示中 1 的个数

2.png

一、问题描述


给你一个整数 n ,对于 0 <= i <= n 中的每个 i ,计算其二进制表示中 1 的个数 ,返回一个长度为 n + 1 的数组ans 作为答案。


题目链接:比特位计数


二、题目要求


样例

输入:n=5输出: [0,1,1,2,1,2]
解释:0-->01-->12-->103-->114-->1005-->101


考察

动态规划中等题型,规律归纳有点难
建议用时15~30min


三、问题分析



对于这道题目,一开始,遇到这一题根本没想到用递归,因为脑子笨规律找不到。直接for循环一个个转换成2进制,对有1的数字进行计数,最后输出结果。

27.png

提交也成功通过了,只是有点耗费时空复杂度。

做出了就行,但我看了关于动态规划的题解,我沉默了,真TM的好!

接下来接着用我们的三步走,老套路了,开干:


第一步 含义搞懂:

题目要求求出二进制中1的个数,那么dp[i]就代表i转换成二进制之后,存储的数字。


第二步 变量初始:

这一题只需要初始一个变量,那就是dp[0]=0


第三步 规律归纳:

0-->01-->12-->13-->24-->15-->26-->27-->38-->19-->210-->2

我把前十个数字分成奇数、偶数分别列出来,看看有什么区别:

如果i是偶数,dp[i]=dp[i/2]; 因为是2进制,偶数除以一个2,也没有多出来一个1。
如果i是奇数,dp[i]=dp[i/2]+1;奇数就是比偶数多出来一个1

三步走,打完收工!


四、编码实现


classSolution {
public:
vector<int>countBits(intn) {
longlonginti,k;//初始化变量vector<int>dp(n+1);//定义数组dp[0]=0;//第二步 变量初始for(i=1;i<=n;i++)
        {
if(i%2==0)//第三步 规律归纳dp[i]=dp[i/2];
elsedp[i]=dp[i/2]+1;
        }
returndp;//输出结果    }
};


五、测试结果

26.png

好家伙,执行用时直接少了2/3

相关文章
|
5月前
|
算法
基于光流法的车辆检测计数算法matlab仿真,对比Horn-Schunck光流和Lucas-Kanade光流
基于光流法的车辆检测计数算法matlab仿真,对比Horn-Schunck光流和Lucas-Kanade光流
|
6天前
|
算法 Java 程序员
【算法每日一练及解题思路】有n级台阶,一次只能上1级或2级,共有多少种走法?
本文深入解析了“爬楼梯问题”,探讨了递归与迭代两种解法,并提供了Java代码实现。通过分析问题本质,帮助读者理解动态规划技巧,提高解决实际编程问题的能力。关键词:Java, 算法, 动态规划, 爬楼梯问题, 递归, 迭代。
17 0
|
2月前
|
搜索推荐 算法
十大排序算法-快排-希尔-堆排-归并-冒泡-桶排-选择-插入-计数-基数
十大排序算法-快排-希尔-堆排-归并-冒泡-桶排-选择-插入-计数-基数
十大排序算法-快排-希尔-堆排-归并-冒泡-桶排-选择-插入-计数-基数
|
4月前
|
机器学习/深度学习 存储 算法
Python5种算法回溯+剪枝、字典序、递归交换、计数回溯、迭代法 实现全排列ll【力扣题47】
Python5种算法回溯+剪枝、字典序、递归交换、计数回溯、迭代法 实现全排列ll【力扣题47】
|
5月前
|
算法
算法题解-计数质数
算法题解-计数质数
|
5月前
|
机器学习/深度学习 算法 vr&ar
☆打卡算法☆LeetCode 204. 计数质数 算法解析
☆打卡算法☆LeetCode 204. 计数质数 算法解析
|
机器学习/深度学习 算法 测试技术
C++算法:有向图计数优化版原理及实现
C++算法:有向图计数优化版原理及实现
|
算法 测试技术 C++
C++算法:有向图访问计数的原理及实现
C++算法:有向图访问计数的原理及实现
|
机器学习/深度学习 算法 计算机视觉
基于机器视觉工具箱的车辆检测计数算法matlab仿真
基于机器视觉工具箱的车辆检测计数算法matlab仿真
|
存储 算法 安全
深入学习 JVM 算法 - 引用计数法
深入学习 JVM 算法 - 引用计数法
183 0
深入学习 JVM 算法 - 引用计数法