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

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,输出就是
[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 CPP