题目链接:Leetcode338
思路:
- 利用x&x-1很容易从前一个少1的数递推过来,复杂度 O ( n ∗ c ) O(n*c) O(n∗c)
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;
}
};