題目: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;
}