LeetCode学习篇一——Counting Bits

题目:Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num calculate the number of 1’s in their binary representation and return them as an array.
通过率:58.4% 难度:medium

解法一:一开始看到这道题,想到的就是直接算出每一个数二进制表示中1的个数然后放进一个向量中,再输出,虽然复杂度比较高,但是容易理解,代码也容易实现,在LeetCode上也通过了。时间复杂度为O(nlogn),主要代码如下:

vector<int> countBits1(int num) {
    vector<int> v;
    for(int i = 0; i <= num; i++) {
        int countOfOne = 0;
        int ti = i;
        while(ti != 0) {
            if(ti % 2 == 1) {
                countOfOne += 1;
            }
            ti /= 2;
        }
        v.push_back(countOfOne);
    }
    return v;
}

解法二:虽然第一种解法通过了测试,但是还是想寻求一种复杂度更低的算法,所以尝试写出多个数字的二进制,尝试寻求规律,见下表:

十进制二进制1的个数
000000
100011
200101
300112
401001
501012
601102
701113
810001
910012
1010102
1110113
1211002
1311013
1411103
1511114

通过观察表格可以发现第2、3个数的二进制1的位数是第1、2个数的分别加1,第5到8个数的二进制1的位数是前4个数的二进制1的位数分别对应加1,依次类推,发现每对应一组和2的幂方相关,于是不需要分别算出每个数的二进制1的位数,可以根据前面得到的来推出后面的,时间复杂度是O(n),代码如下:

vector<int> countBits(int num) {
    vector<int> v;
     if(num == 0) {
        v.push_back(0);
        return v;
     }       
     v.push_back(0);
     v.push_back(1);
     int tnum = 2, k = 1;
     while(tnum <= num) {
        int v_size = v.size();
        for(int i = pow(2,k); i < pow(2,k+1); i++) {
            v.push_back(v[i-v_size]+1);
            tnum++; 
            if(tnum > num) {
                break;
            }
        }
        k++;
     }
     return v;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值