LeetCode 338. Counting Bits

来源:互联网 发布:电脑声音增强软件 编辑:程序博客网 时间:2024/05/22 16:49

Description

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.

Solution

题目给一整数n,要求统计从0到n每个数的二进制写法中1的个数,然后存入一个一维数组中返回。写出0到15的数的二进制和1的个数如下:

    0000    0-------------    0001    1-------------    0010    1    0011    2-------------    0100    1    0101    2    0110    2    0111    3-------------    1000    1    1001    2    1010    2    1011    3    1100    2    1101    3    1110    3    1111    4

除去前两个数字0个1,从2开始,2和3,是[21, 22)区间的,值为1和2。而4到7属于[22, 23)区间的,值为1,2,2,3,前半部分1和2和上一区间相同,2和3是上面的基础上每个数字加1。再看8到15,属于[23, 24)区间的,同样满足上述规律。

class Solution {public:    vector<int> countBits(int num) {        if (num == 0) return {0};        vector<int> res{0, 1};        int k = 2, i = 2;        while (i <= num) {            for (i = pow(2, k - 1); i < pow(2, k); ++i) {                if (i > num) break;                int t = (pow(2, k) - pow(2, k - 1)) / 2;                if (i < pow(2, k - 1) + t) res.push_back(res[i - t]);                else res.push_back(res[i - t] + 1);            }            ++k;        }        return res;    }};
0 0
原创粉丝点击