LeetCode338.比特位计数

先以2,3为例,它们的二进制分别是10、11,可以看到,忽略其二进制中最高位的1之后,这组数中二进制位为1的数量分别和数字0,1中二进制位为1的数量相同,再以4,5,6,7为例,他们的二进制分别是100、101、110、111,忽略其二进制中最高位的1之后,这组数中二进制位为1的数量分别和数字0,1,2,3中二进制位为1的数量相同,至此可以得出规律:

res[i+j]=res[j]+1;其中i2的幂次数(2,4,8等等),j的取值范围是[0,i);

复制代码
class Solution {
    public int[] countBits(int n) {
        if(n==0) return new int[]{0};
        if(n==1) return new int[]{0,1};
        int[] res = new int[n+1];
        res[0]=0;res[1]=1;
        for(int i=2;i<=n;){
            for(int j=0;j<i;j++){
                if(i+j<=n){
                    res[i+j]=res[j]+1;
                }else{
                    break;
                }
            }
            i=2*i;
        }
        return res;
    }
}
复制代码

 

posted @   rockdow  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示