leetcode 338. Counting Bits

Posted ctqchina

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode 338. Counting Bits相关的知识,希望对你有一定的参考价值。

很容易想到时间复杂度为O(nlogn)的做法。可以做一个小优化,就是先找出小于num的2的次幂,然后ans[i] = 1 + ans[i-max2];就是i的二进制中1的个数等于1+i-小于i的最大的2次幂的1的个数。

class Solution {
    public int[] countBits(int num) {
        
        num++;
        int[] ans = new int[num], can = new int [num];
        ans[0] = 0;
        if(num == 1) return ans;
        for(int i=2;i<num;i*=2) {
            can[i] = i;
            ans[i] = 1;
        }
        for(int i=3;i<num;i++){
            if(can[i] == 0) can[i] = can[i-1];
        }
        ans[1] = 1;
        for(int i=3;i<num;i++){
            
            ans[i] = 1+ans[i-can[i]];
        }
        return ans;
    }
}

 

以上是关于leetcode 338. Counting Bits的主要内容,如果未能解决你的问题,请参考以下文章

leetcode [338]Counting Bits

LeetCode 338. Counting Bits

LeetCode338. Counting Bits (2 solutions)

LeetCode 338. Counting Bits

LeetCode 338. Counting Bits

[Leetcode] 338. Counting Bits