Java実装LeetCode 338ビットカウント

338ビットカウント

非負整数NUMを考えます。0≤I≤I、二進数字1と配列として返すそれらの数を算出し、各デジタルNUM範囲のため。

例1:

入力:2
出力:[0,1,1]
例2:

入力:5
出力:[0,1,1,2,1,2]
アドバンス:

時間の複雑さを考えるとO(N *はsizeof(整数)がされて ) 非常に簡単に答えます。しかし、あなたは1が通過して線形時間O(n)の中でそれを行うことができますか?
アルゴリズムの複雑さの空間要件はO(N)です。
あなたは、さらにソリューション、それを改善することができますか?要求は、これを実行するために、任意の組み込み関数(例えば、中__builtin_popcount C ++)でのC ++や他の言語を使用していません。

PS:
I& - ( - 1 I)Iよりも小さく、I&(I - 1)の数を有する(I 1)は、iが1(もしあれば)、そのためI&右端除去することができます数1プラス1 -数iがI&(1 I)の一つであるので前に、カウント

class Solution {
    public int[] countBits(int num) {
        int[] res = new int[num + 1];
        for(int i = 1;i<= num;i++){  //注意要从1开始,0不满足
            res[i] = res[i & (i - 1)] + 1;
        }
        return res;
    }
}
リリース1452元の記事 ウォンの賞賛10000 + ビュー173万+

おすすめ

転載: blog.csdn.net/a1439775520/article/details/104737876