您的位置:首页 > 编程语言 > C语言/C++

【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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ leetcode 位操作