美文网首页
Leetcode解题报告——338. Counting Bits

Leetcode解题报告——338. Counting Bits

作者: Jarryd | 来源:发表于2017-11-26 11:06 被阅读0次

    题目要求:
    Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num calculate the number of 1's in their binary representation and return them as an array.

    Example:
    For num = 5 you should return [0,1,1,2,1,2]

    大概题意:
    给定一个正整数n,计算 0<= i <= n 中 i 的二进制中的1的个数,并以数组的形式返回。

    解题思路:
    维护一个数组dp, 对于 i,如果 i 是 2 的 n 次幂,则dp[i] = 1,
    否则,dp[i] = 1 + dp[i-2^log2(i)]。因为对于一个非0 整数 i,其二进制的最高位必定为1,对应的十进制整数为 2^log2(i)。我们可以把原问题分解为 最高位中1的个数 + 剩余位中1的个数,剩余位又可继续分,形成递归。

    • 源码示例:
     public int[] countBits(int num) {
            int [] dp = new int[num+1];
    
            dp[0] = 0;
    
            for (int i =1; i <=num ; i++) {
                int v1 = (int) (Math.log(i)/Math.log(2));  //log2N = logeN /loge2
                int v2 = (int) Math.pow(2,v1); // 2^n
                dp[i] = v2 == i ? 1: 1 + dp[i-v2];
            }
            return dp;
        }
    

    相关文章

      网友评论

          本文标题:Leetcode解题报告——338. Counting Bits

          本文链接:https://www.haomeiwen.com/subject/uxckbxtx.html