您的位置:首页 > 其它

LeetCode 338. Counting Bits

2017-04-23 23:33 309 查看

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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode