比特位计数

比特位计数

给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,
计算其二进制数中的 1 的数目并将它们作为数组返回。

题解:这种题如果不加限制的话可以选择移位&1的方式计算1的个数
但是要求是在O(N)的时间复杂度下完成就需要脑筋急转弯啦
0000 ---------> 0
0001 ---------> 1 ——————0000&0001=0000+1
0010 ---------> 1 ——————0001&0010=0000+1
0011 ---------> 2 ——————0010&0011=0010+1
0100 ---------> 1 ——————0011&0100=0000+1
0101 ---------> 2 ——————0100&0101=0100+1
0111 ---------> 3 ——————0101&0111=0101+1

使用&操作发现什么,0001中1个个数等于1&0后剩余的1的个数+1,此时问题就可以向小规模问题转化,因为&操作后i和i-1中1的结果说明i和i-1中有共同的比特位为1的
那么我们只需要找到&结果为dp[i&i-1]中1的个数,举例:
0100&0011->0000此时结果为0,那么我们去找0中1存在的个数=0
由于i和i-1在比特位上只相差1,所以每次+1就行

public class countBits {

    public static int[] countBits(int num){
        int n=1;
        int[] dp=new int[num+1];
        for (int i=1;i<=num;i++){
            dp[n++]=dp[i&i-1]+1;
        }
        return dp;
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值