Leetcode解题报告——338. Counting Bits

2017-11-26  本文已影响0人  Jarryd

题目要求:
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;
    }
上一篇下一篇

猜你喜欢

热点阅读