【LeetCode-338】Counting Bits(C++)
来源:互联网 发布:ubuntu u盘启动 编辑:程序博客网 时间:2024/05/22 14:32
题目要求:给出一个非负整数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; }};
0 0
- 【LeetCode-338】Counting Bits(C++)
- leetcode 338 c++. Counting Bits
- [C]LeetCode:Counting Bits
- leetcode:bits:Counting Bits(338)
- 【LeetCode-338】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
- Counting Bits leetcode 338
- [LeetCode 338] Counting Bits
- LeetCode-338:Counting Bits
- LeetCode-338:Counting Bits
- LeetCode[338] Counting Bits
- LeetCode#338 Counting Bits
- LeetCode 338 Counting Bits
- 第三周项目2 建设“顺序表”算法库
- C++面向对象笔记
- java.util.Date,java.sql.Date及java.sql.Timestamp
- Pits - CSS3+JS网页小游戏
- ListView局部刷新
- 【LeetCode-338】Counting Bits(C++)
- 指向学生类的指针
- 沈阳网赛1003 HDU 5894 hannnnah_j’s Biological Test
- Java System.arraycopy方法的使用
- JavaEE之初学者
- python3基础
- 码云上创建项目并clone到idea
- IO流的具体案例
- Caffe常见问题解决:NuGet Error,无法打开输入文件“opencv_calib3d240d.lib”