当前位置:网站首页>leetcode-338.比特位计数
leetcode-338.比特位计数
2022-08-02 05:15:00 【KGundam】
位运算
题目详情
给你一个整数 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
思路:
本题利用动态规划+位运算求解
dp[i]表示数字i的二进制含有1的数量
对于0~n这些连续的数字,它们的二进制表示的是…0 …1 …0 …1 末位是01交替的
对于i这个数字,如果它二进制的末位是1,那么说明i-1这个数字比i少一个1
所以dp[i] = dp[i-1] + 1
如果i这个数字末位是0,说明它末位进位了,i-1末位是1
但是我们还不知道前面的情况,比如3和4
0011 0100这种情况i反倒比i-1少一个1,那么我们不能简单地利用
i和i-1之间的关系判断,我们对于这种情况可以利用算术右移
i>>1一定比i小,所以dp[i>>1]一定已经计算过了,所以可以利用它来更新dp
所以本题的关键就是找到比i更小的一个值,来更新dp[i]
所以我们也可以利用i&(i-1)这个更小的值来更新
我的代码:
class Solution
{
public:
vector<int> countBits(int n)
{
vector<int> dp(n + 1, 0);
for (int i = 1; i <= n; ++i)
{
//i&1判断末位是否为1,如果是就↓,如果不是就和dp[i>>1]数量一样
dp[i] = i & 1? dp[i-1] + 1 : dp[i>>1];
//等价于dp[i] = dp[i&(i-1)] + 1;
/*在这个式子里,i&(i-1)将i中最低位的1给去除了 不管去除的是末位还是更高位的1,这个值都比i小(dp存在) 我们再把去除的1加回来即可 */
}
return dp;
}
};
位运算常用技巧

边栏推荐
- JUC(二)原子类:CAS、乐观锁、Unsafe和原子类
- 对node工程进行压力测试与性能分析
- Redis-----非关系数据库
- What is the most important ability of a programmer?
- C语言基础知识梳理总结:零基础入门请看这一篇
- Features and installation of non-relational database MongoDB
- leetcode一步解决链表反转问题
- C language: Check for omissions and fill in vacancies (3)
- 说好的女程序员做测试有优势?面试十几家,被面试官虐哭~~
- Browser onload event
猜你喜欢

制作web3d动态产品展示的优点

C language: Check for omissions and fill in vacancies (3)

分布式文件存储服务器之Minio对象存储技术参考指南

leetcode一步解决链表合并问题

使用TinkerPop框架对GDB增删改查

Detailed explanation of interface in Go language

BGP experiment (route reflector, federation, route optimization)

Three methods of importing sql files in MySQL

VMTK环境配置记录

程序员写PPT的小技巧
随机推荐
关于鸿蒙系统 JS UI 框架源码的分析
网安学习-内网渗透4
Redis(十二) - Redis消息队列
如何进行并发数计算(稳定性测试和压力测试)?
软件测试的需求人才越来越多,为什么大家还是不太愿意走软件测试的道路?
A list of 300+ learning resources compiled by senior engineers of the Tao Department (the latest version in 2021)
There are more and more talents in software testing. Why are people still reluctant to take the road of software testing?
如何优化OpenSumi终端性能?
双重for循环案例(用js打印九九乘法表)
制作web3d动态产品展示的优点
JUC(二)原子类:CAS、乐观锁、Unsafe和原子类
kubernetes 亲和、反亲和、污点、容忍
C language entry combat (13): decimal number to binary
leetcode 665. Non-decreasing Array 非递减数列(中等)
Shuttle + Alluxio 加速内存Shuffle起飞
Polar Parametrization for Vision-based Surround-View 3D Detection 论文笔记
家用 NAS 服务器(4)| MergerFS和SnapRaid数据定时备份
Detailed installation and configuration of golang environment
51单片机外设篇:点阵式LCD
Linux CentOS8安装Redis6