leetcode 338 Counting Bits【leetcode新题】 数11,C++
2016-03-26 17:17
411 查看
题目(心急的直接拉最下面看代码,C++,保障AC,不AC你打我):
简单来说,就是给定一个数num,数一下从0~num这num+1个数字中,其二进制有多少个1.比如num=5,就是0~5六个数,0有0个1,1有1个1,2有1个1,3有2个1,4有1个1,5有2个1,输出就是
下面有几个小规定:1.很容易用o(n*sizeof(integer))复杂度解出来;但你能用O(n)搞定吗?(CAO!我第一个办法就是o(n*sizeof(integer))!怎么办?我好好想想)
2.空间复杂度O(n),这个容易,就是不能回溯嘛;
3.你能想一个老板一样做出来吗?(像个老板做出来?这是个什么鬼?老板是怎么做的?啥意思啊?)解答本题,不用任何builtin(有道翻译:内嵌函数,这是什么鬼?不懂)函数,比如builtin popcount 之类的,在C++或者其他编程语言里的。(这个要求呢,我就看不懂了,什么叫不用内嵌函数,是指不用什么count++或者与或非函数吗?我就当这么理解吧。。。。。。基础不牢,地动山摇啊)
好啦,不瞎扯,直接上答案:
方法1:(别打我....我再废话几句,不想看直接往下拉呢。。。。)我第一个反应,用while(x){count++;x=x&(x-1);}对每个数数呗,反正复杂度低,也确实可以AC。不过,这不符合题目中进阶规定(不够装逼),是o(n*sizeof(integer))复杂度。嗯,我再想想。先把这个代码贴下,大家可以记一下,这个是数1的常用办法:
class
Solution {
public:
vector<int> countBits(int num) {//CPP
int count,x;
vector<int> res;
for(int i=0;i<=num;i++){
count=0;
x=i;
while(x){
count++;
x=x&(x-1);
}
res.push_back(count);
}
return res;
}
};
方法二:要O(n)复杂度,就不能一个个数数1呢,怎么办呢?迭代呗,你想嘛,3是11,2是10,1是01,3刚好等于1+2中的1的个数;9是1001,等于8(1000)中1(0001)的个数和1中1的个数和。对于任何一个数,要么是2的N次方,要么是2的N次方+一个小于2的N次方的数(废话)。那么一个数X,满足X=2^N+(X-2^N),而其中1的个数,恰好也满足哦~countBits(x)=countBits(2^N)+countBit(X-2^N)。所以解法如下:
class
Solution {
public:
vector<int> countBits(int num) {
int x,m1,m2;
vector<int> res;
if(num<2){
if(num<0){
return res;
}
if(num==0){
res.push_back(0);
return res;
}
if(num==1){
res.push_back(0);
res.push_back(1);
return res;
}
}
res.push_back(0);
res.push_back(1);
m1=1;m2=2;
for(int i=2;i<=num;i++){
if (i==m2){
x=1;
m2*=2;
m1*=2;
}
else{
x=res[m1]+res[i-m1];
}
res.push_back(x);
}
return res;
}
};
简单来说,就是给定一个数num,数一下从0~num这num+1个数字中,其二进制有多少个1.比如num=5,就是0~5六个数,0有0个1,1有1个1,2有1个1,3有2个1,4有1个1,5有2个1,输出就是
[0,1,1,2,1,2].
下面有几个小规定:1.很容易用o(n*sizeof(integer))复杂度解出来;但你能用O(n)搞定吗?(CAO!我第一个办法就是o(n*sizeof(integer))!怎么办?我好好想想)
2.空间复杂度O(n),这个容易,就是不能回溯嘛;
3.你能想一个老板一样做出来吗?(像个老板做出来?这是个什么鬼?老板是怎么做的?啥意思啊?)解答本题,不用任何builtin(有道翻译:内嵌函数,这是什么鬼?不懂)函数,比如builtin popcount 之类的,在C++或者其他编程语言里的。(这个要求呢,我就看不懂了,什么叫不用内嵌函数,是指不用什么count++或者与或非函数吗?我就当这么理解吧。。。。。。基础不牢,地动山摇啊)
好啦,不瞎扯,直接上答案:
方法1:(别打我....我再废话几句,不想看直接往下拉呢。。。。)我第一个反应,用while(x){count++;x=x&(x-1);}对每个数数呗,反正复杂度低,也确实可以AC。不过,这不符合题目中进阶规定(不够装逼),是o(n*sizeof(integer))复杂度。嗯,我再想想。先把这个代码贴下,大家可以记一下,这个是数1的常用办法:
class
Solution {
public:
vector<int> countBits(int num) {//CPP
int count,x;
vector<int> res;
for(int i=0;i<=num;i++){
count=0;
x=i;
while(x){
count++;
x=x&(x-1);
}
res.push_back(count);
}
return res;
}
};
方法二:要O(n)复杂度,就不能一个个数数1呢,怎么办呢?迭代呗,你想嘛,3是11,2是10,1是01,3刚好等于1+2中的1的个数;9是1001,等于8(1000)中1(0001)的个数和1中1的个数和。对于任何一个数,要么是2的N次方,要么是2的N次方+一个小于2的N次方的数(废话)。那么一个数X,满足X=2^N+(X-2^N),而其中1的个数,恰好也满足哦~countBits(x)=countBits(2^N)+countBit(X-2^N)。所以解法如下:
class
Solution {
public:
vector<int> countBits(int num) {
int x,m1,m2;
vector<int> res;
if(num<2){
if(num<0){
return res;
}
if(num==0){
res.push_back(0);
return res;
}
if(num==1){
res.push_back(0);
res.push_back(1);
return res;
}
}
res.push_back(0);
res.push_back(1);
m1=1;m2=2;
for(int i=2;i<=num;i++){
if (i==m2){
x=1;
m2*=2;
m1*=2;
}
else{
x=res[m1]+res[i-m1];
}
res.push_back(x);
}
return res;
}
};
相关文章推荐
- leetcode 179 Largest Number
- leetcode 24 Swap Nodes in Pairs
- leetcode 2 Add Two Numbers 方法1
- leetcode 2 Add Two Numbers 方法2
- CPP 虚函数、虚函数表及虚拟继承(转)
- leetcode----Longest Substring Without Repeating Characters
- [LeetCode]47 Permutations II
- [LeetCode]65 Valid Number
- [LeetCode]123 Best Time to Buy and Sell Stock III
- [LeetCode] String Reorder Distance Apart
- [LeetCode] Sliding Window Maximum
- [LeetCode] Find the k-th Smallest Element in the Union of Two Sorted Arrays
- [LeetCode] Determine If Two Rectangles Overlap
- [LeetCode] A Distance Maximizing Problem
- leetcode_linearList
- leetcode_linearList02
- Deploying Control Plane Policing
- 021-Merge Two Sorted Lists(合并两个排好序的单链表);leetcode
- LeetCode[Day 1] Two Sum 题解
- LeetCode[Day 2] Median of Two Sorted Arrays 题解