LeetCode學習篇一——Counting Bits

題目: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.
通過率:58.4% 難度:medium

解法一:一開始看到這道題,想到的就是直接算出每一個數二進制表示中1的個數然後放進一個向量中,再輸出,雖然複雜度比較高,但是容易理解,代碼也容易實現,在LeetCode上也通過了。時間複雜度爲O(nlogn),主要代碼如下:

vector<int> countBits1(int num) {
    vector<int> v;
    for(int i = 0; i <= num; i++) {
        int countOfOne = 0;
        int ti = i;
        while(ti != 0) {
            if(ti % 2 == 1) {
                countOfOne += 1;
            }
            ti /= 2;
        }
        v.push_back(countOfOne);
    }
    return v;
}

解法二:雖然第一種解法通過了測試,但是還是想尋求一種複雜度更低的算法,所以嘗試寫出多個數字的二進制,嘗試尋求規律,見下表:

十進制 二進制 1的個數
0 0000 0
1 0001 1
2 0010 1
3 0011 2
4 0100 1
5 0101 2
6 0110 2
7 0111 3
8 1000 1
9 1001 2
10 1010 2
11 1011 3
12 1100 2
13 1101 3
14 1110 3
15 1111 4

通過觀察表格可以發現第2、3個數的二進制1的位數是第1、2個數的分別加1,第5到8個數的二進制1的位數是前4個數的二進制1的位數分別對應加1,依次類推,發現每對應一組和2的冪方相關,於是不需要分別算出每個數的二進制1的位數,可以根據前面得到的來推出後面的,時間複雜度是O(n),代碼如下:

vector<int> countBits(int num) {
    vector<int> v;
     if(num == 0) {
        v.push_back(0);
        return v;
     }       
     v.push_back(0);
     v.push_back(1);
     int tnum = 2, k = 1;
     while(tnum <= num) {
        int v_size = v.size();
        for(int i = pow(2,k); i < pow(2,k+1); i++) {
            v.push_back(v[i-v_size]+1);
            tnum++; 
            if(tnum > num) {
                break;
            }
        }
        k++;
     }
     return v;
}
發佈了37 篇原創文章 · 獲贊 3 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章