LeetCode 338. 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.

Example:
For num = 5 you should return [0,1,1,2,1,2].

Follow up:

  • It is very easy to come up with a solution with run time O(n*sizeof(integer)). But can you do it in linear time O(n) /possibly in a single pass?
  • Space complexity should be O(n).
  • Can you do it like a boss? Do it without using any builtin function like __builtin_popcount in c++ or in any other language.

【题解】

我们先拿num=3为例,结果为[0, 1, 1, 2],得到3以内数字的结果之后,4~7的结果可以在此基础上确定,如下0~3二进制表示为:

   bin  num
000    0
001    1
010    1
011    2
4~7二进制表示为:
  bin num
100    1
101    2
110    2
111    3
从上面分析可以看出,4~7除了最高位其他位和0~3是相同的,而最高位是1,这样4~7的结果就可以在0~3的基础上分别加1获得,题目就很容易解决了。

【代码】

    vector<int> countBits(int num) {
        vector<int> result(num + 1, 0);
        if (num == 0)
            return result;
            
        result[1] = 1;
        int nCount = 0;
        int nTmp = num;
        while (nTmp != 0) {
            nTmp /= 2;
            nCount++;
        }
        
        for (int k = 2; k <= nCount; k++) {
            int nLowerBoundary = pow(2.0, k - 1);
            int nUpperBoundart = nLowerBoundary*2;
            for (int i = nLowerBoundary; i < nUpperBoundart && i <= num; i++)
                result[i] = result[i - nLowerBoundary] + 1;
            
        }
        return result;
    }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值