countingBits

countingBits

1. 問題描述

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].

Follow up:

It is very easy to come up with a solution with run time O(n*sizeof(integer)). But can you do it in linear time O(n) /possibly in a single pass?
Space complexity should be O(n).
Can you do it like a boss? Do it without using any builtin function like __builtin_popcount in c++ or in any other language.
Hint:

You should make use of what you have produced already.
Divide the numbers in ranges like [2-3], [4-7], [8-15] and so on. And try to generate new range from previous.
Or does the odd/even status of the number help you in calculating the number of 1s?

大意是輸入一個無符號整數n,返回一個列表,保存0到n的每個整數的二進制表示中1的個數,時間複雜度是線性。

2. 解題思路

原題給了提示,如圖所示。將數組按2的冪次展開,後面的結果可以通過前面的結果複製或者加1得到,依次計算所有數組結果。基於觀察得到的計算方法,沒有經過嚴格證明。

解題思路

3. c代碼實現

/**
 * Return an array of size *returnSize.
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* countBits(int num, int* returnSize) {

    *returnSize = num+1;
    int* bits=NULL;

    bits=(int*)malloc((num+1)*sizeof(*bits));

    if (num==0) {
        bits[0]=0;
    }
    else if (num==1)
    {
        bits[0]=0;
        bits[1]=1;

    }
    else
    {

        bits[0]=0;
        bits[1]=1;

        for (int i=2; i<=num; i*=2) {
            //1. copy the first half from previous array
            for (int j=i; (j<i+i/2)&&(j<=num); j++) {
                bits[j]=bits[j-i/2];

            }

            //2. plus 1 from the previous array
            for (int j=i+i/2; (j<2*i)&&(j<=num); j++) {
                bits[j]=bits[j-i/2]+1;

            }
        }
    }




    return bits;
}

c源碼鏈接:https://github.com/lilingyu/countingBits

4. 其他

有三種其他算法。
一是通過右移計算,最低位bit遞歸:ans[n] = ans[n >> 1] + (n & 1)
二是最高位bit遞歸:ans[n] = ans[n - highbits(n)] + 1
三是按位與:ans[n] = ans[n & (n - 1)] + 1

參考鏈接:http://bookshadow.com/weblog/2016/03/18/leetcode-counting-bits/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章