題目鏈接:Leetcode338
思路:
- 利用x&x-1很容易從前一個少1的數遞推過來,複雜度
class Solution {
public:
vector<int> countBits(int num) {
//利用x&x-1快速計算比該數位小1的數然後遞推
vector<int> ans; ans.clear();
ans.push_back(0);
for(int x=1; x<=num; x++)
ans.push_back(ans[x&x-1]+1);
return ans;
}
};
- 根據奇數和偶數的二進制位的特點,對於奇數可以由前一個偶數轉移過來,對於偶數則可以由比它少最後一個0的數遞推過來
class Solution {
public:
vector<int> countBits(int num) {
vector<int> ans; ans.clear();
ans.push_back(0);
for(int x=1; x<=num; x++)
if(x&1) ans.push_back(ans[x-1]+1); //少一個1
else ans.push_back(ans[x>>1]); //少一個0無影響
return ans;
}
};
- 類似法二,奇數也可以由少一個位1的數遞推過來
class Solution {
public:
vector<int> countBits(int num) {
vector<int> ans; ans.clear();
ans.push_back(0);
for(int x=1; x<=num; x++)
ans.push_back(ans[x>>1]+(x&1)); //少一個1
return ans;
}
};