标签:10 二进制 比特 int 计数 vector 动态 dp 2k
338. 比特位计数 - 力扣(LeetCode) (leetcode-cn.com)
记录这道题主要不是因为它本身难度有多大,而是它的解法中间有一些技巧以后可能用得到,故在此记录
1、判断一个数是否为2的整数次幂
由于2的整数次幂只有最高位是1,其他位全为0。所以2n-1就全为1,且最高位为0。因此我们可以用如下代码判断一个数是否为2的整数次幂。
i&(i-1)==0
2、动态规划+最高有效位
设i的二进制表示中有dp[i]个1。
为了计算i的二进制表示中有多少个1,我们如果能找到0≤j<i,使得dp[i]=dp[j]+1,那么我们只需要遍历一遍数组即可求出我们所需要的结果。
令x=2k,对于x<y<2k+1,令z=y-x,则我们就可以得到dp[y]=dp[z]+1;
例如,8=(1000)2,10=(1010)2,所以z=10-8=2=(10)2,满足题意。
这个想法的根源就在于对于2k<x<2k+1,其二进制数的组成是在x-2k的最高位补了一个1。
同样,我们也可以从最低位考虑,这里不再赘述。
class Solution {
public:
vector<int> countBits(int n) {
vector<int> dp(n+1,0);
int h=0;
for(int i=1;i<=n;i++){
if((i&(i-1))==0){
h=i;
}
dp[i]=dp[i-h]+1;
}
return dp;
}
};
标签:10,二进制,比特,int,计数,vector,动态,dp,2k 来源: https://www.cnblogs.com/yjx-7355608/p/16036380.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。