其他分享
首页 > 其他分享> > 【动态规划】——比特位计数

【动态规划】——比特位计数

作者:互联网

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