338. Counting Bits
- Total Accepted: 35688
- Total Submissions: 61823
- Difficulty: Medium
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.
Hint:
- You should make use of what you have produced already.
- Divide the numbers in ranges like [2-3], [4-7], [8-15] and so on. And try to generate new range from previous.
- Or does the odd/even status of the number help you in calculating the number of 1s?
思路:假设res[i]意味着数字i的二进制中1的个数。
对于数i有res[i*2]=res[i];res[i*2+1]=res[i]
其实也可以写成这样:res[i]=res[i/2] + i%2。
代码:
对于数i有,res[i*2]=res[i],res[i*2+1]=res[i]。
用了一个技巧,O(n/2)的复杂度。
class Solution { public: vector<int> countBits(int num) { vector<int> res(num + 2, 0);//技巧:多申请了一个内存。num为偶数时会用到,num为奇数时用不到。最后都要删除。 int half = num/2; for (int i = 0; i <= half; i++) { res[i*2] = res[i]; res[i*2+1] = res[i] + 1; } res.pop_back();//不论num是奇数还是偶数,这步都要实施 return res; } };
其实也可以写成这样:res[i]=res[i/2] + i%2。
1 class Solution { 2 public: 3 vector<int> countBits(int num) { 4 vector<int> res(num+1,0); 5 int i; 6 for(i=1;i<=num;i++){ 7 res[i]=res[i>>1]+i%2; 8 } 9 return res; 10 } 11 };