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 = 5you 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】338. Counting Bits
- *Leetcode 338. Counting Bits
- Leetcode 338. Counting Bits
- 338. Counting Bits【M】【leetcode题解】
- LeetCode 338. Counting Bits(统计比特数)
- Leetcode--338. Counting Bits
- LeetCode338. Counting Bits还有更好的解法吗
- LeetCode笔记:338. Counting Bits
- 【LeetCode】338. Counting Bits
- LeetCode - 338. Counting Bits
- Leetcode 338. Counting Bits
- Leetcode 338. Counting Bits
- 【leetcode】338. Counting Bits
- 【leetcode】338. Counting Bits(C++ & Python)
- 【LeetCode】338. Counting Bits
- (LeetCode) 338. Counting Bits
- LeetCode 338. Counting Bits
- LeetCode 338. Counting Bits(java)
- LeetCode - 338. Counting Bits
- LeetCode-338. Counting Bits