【LeetCode-338】Counting Bits(C++)
2016-09-18 21:09
429 查看
题目要求:给出一个非负整数num,求出0-num范围内的(num+1)个整数,每个整数的二进制表达中1的位数。Follow Up:时间复杂度为O(n*sizeof(integer))的解法很简单,要求实现时间复杂度为O(n)的算法。
解题方法:
1. 时间复杂度为O(n*sizeof(integer))的算法。程序如下,一共有n+1个数,每个数都要一位一位的判断是否为1,所以时间复杂度为O(n*sizeof(integer))。这是时间复杂度最高的一种算法,显然不好。
class Solution {
public:
vector<int> countBits(int num) {
vector<int> v;
for(int i=0;i<=num;i++){
v.push_back(countSingleBits(i));
}
return v;
}
private:
int countSingleBits(int num){
int count=0;
unsigned int flag=1;
while(flag){
if(num&flag)
count++;
flag=flag<<1;
}
return count;
}
};2. 比1稍微好一点的解法。这种解法巧妙的利用n=n&(n-1)得到的结果就是将n最右边的一位1变成0.然后循环一直到n变成0为止。(剑指offer上面有解释)。这个算法的时间复杂度比1稍微好一点,对于每个数,不用每一位都要判断,所以循环次数不是sizeof(integer),整数中有几个1就循环几次。
class Solution {
public:
vector<int> countBits(int num) {
vector<int> v;
for(int i=0;i<=num;i++){
v.push_back(countSingleBits(i));
}
return v;
}
private:
int countSingleBits(int num){
int count=0;
while(num){
count++;
num=num&(num-1);
}
return count;
}
};3. 找到n+1个数中的规律。countSingleBits(n)=countSingleBits(n>>1)+(n&1) ,其中countSingleBits(n)表示n中的1的位数。n>>1对n进行右移操作,移去了n最右边的一位数,如果n最右边的位数为1,则将(n>>1)中1的个数加1即可得到n中1的位数,反之则不用加。而(n>>1)即n/2,这个数中1的位数已经提前算出来存在数组中了,所以直接从数组中取出来即可。这种算法的时间复杂度为O(n)。
class Solution {
public:
vector<int> countBits(int num) {
vector<int> v;
v.push_back(0);
for(int i=1;i<=num;i++){
int count=v[i>>1]+(i&1);
v.push_back(count);
}
return v;
}
};
解题方法:
1. 时间复杂度为O(n*sizeof(integer))的算法。程序如下,一共有n+1个数,每个数都要一位一位的判断是否为1,所以时间复杂度为O(n*sizeof(integer))。这是时间复杂度最高的一种算法,显然不好。
class Solution {
public:
vector<int> countBits(int num) {
vector<int> v;
for(int i=0;i<=num;i++){
v.push_back(countSingleBits(i));
}
return v;
}
private:
int countSingleBits(int num){
int count=0;
unsigned int flag=1;
while(flag){
if(num&flag)
count++;
flag=flag<<1;
}
return count;
}
};2. 比1稍微好一点的解法。这种解法巧妙的利用n=n&(n-1)得到的结果就是将n最右边的一位1变成0.然后循环一直到n变成0为止。(剑指offer上面有解释)。这个算法的时间复杂度比1稍微好一点,对于每个数,不用每一位都要判断,所以循环次数不是sizeof(integer),整数中有几个1就循环几次。
class Solution {
public:
vector<int> countBits(int num) {
vector<int> v;
for(int i=0;i<=num;i++){
v.push_back(countSingleBits(i));
}
return v;
}
private:
int countSingleBits(int num){
int count=0;
while(num){
count++;
num=num&(num-1);
}
return count;
}
};3. 找到n+1个数中的规律。countSingleBits(n)=countSingleBits(n>>1)+(n&1) ,其中countSingleBits(n)表示n中的1的位数。n>>1对n进行右移操作,移去了n最右边的一位数,如果n最右边的位数为1,则将(n>>1)中1的个数加1即可得到n中1的位数,反之则不用加。而(n>>1)即n/2,这个数中1的位数已经提前算出来存在数组中了,所以直接从数组中取出来即可。这种算法的时间复杂度为O(n)。
class Solution {
public:
vector<int> countBits(int num) {
vector<int> v;
v.push_back(0);
for(int i=1;i<=num;i++){
int count=v[i>>1]+(i&1);
v.push_back(count);
}
return v;
}
};
相关文章推荐
- leetcode 338:Counting Bits 数1,C++
- leetcode 338 Counting Bits【leetcode新题】 数11,C++
- leetcode338 Counting Bits
- LeetCode 338 Counting Bits(位运算)
- Leetcode_338_Counting Bits
- leetcode:338. Counting Bits
- LeetCode 第 338 题 (Counting Bits)
- leetcode-338-Counting Bits
- leetcode 338 Counting Bits C++
- LeetCode 第 338 题 (Counting Bits)
- LeetCode 338 -Counting Bits ( JAVA )
- LeetCode 338 Counting Bits
- Leetcode 338 Counting Bits
- [leetcode-338]Counting Bits(java)
- LeetCode 第 338 题 (Counting Bits)
- 【LeetCode】Counting Bits(338)
- Java [Leetcode 338]Counting Bits
- [leetcode-338]Counting Bits
- [LeetCode 338] Counting Bits
- leetcode338:Counting Bits(medium)