比特位计数

题目:

  

 思路:

  1 Brian Kernighan算法   x &= (x - 1) 每次可以从最右边擦除一个二进数 1

  2 动态规划 


 (一)代码 Brian Kernighan算法 

class Solution {
    public int[] countBits(int n) {

        //位运算 算法 x &= (x - 1)  每次可以从最右边擦除一个二进数 1
        //Brian Kernighan算法
        int[] res = new int[n+1];
        for(int i = 1 ; i <= n ; i++){
            res[i] = getRes(i);
        }
        return res;
    }

    public int getRes(int i){
        int res = 0;
        while(i > 0){
            i &= (i - 1);
            res++;
        }
        return res;
    }
}

(二)代码 动态规划 - 最低有效位  不太懂这个

  

class Solution {
    public int[] countBits(int n) {
        //动态规划
        int[] dp = new int[n+1];

        for(int i = 1 ; i <= n ; i++){
            dp[i] = dp[i >> 1] + (i & 1);
        }

        return dp;

    }
}

 

 

           。。。。。

      

 

posted @ 2021-07-14 16:04  朝才  阅读(51)  评论(0)    收藏  举报