【动态规划】——比特位计数
作者:互联网
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