338. Counting Bits
Description
Given an integer n, return an array ans of length n + 1 such that for each i (0 <= i <= n), ans[i] is the number of 1's in the binary representation of i.
Do not solve it with built-in functions (i.e., like __builtin_popcount in C++).
Example 1:
Input: n = 2 Output: [0,1,1] Explanation: 0 --> 0 1 --> 1 2 --> 10
Example 2:
Input: n = 5 Output: [0,1,1,2,1,2] Explanation: 0 --> 0 1 --> 1 2 --> 10 3 --> 11 4 --> 100 5 --> 101
Constraints:
0 <= n <= 105
Follow up:
- It is very easy to come up with a solution with a runtime of
O(n log n). Can you do it in linear timeO(n)and possibly in a single pass?
Solutions
Solution 1
Thinking
Count set bits of every integer in \(0\ldots n\). Per-number bit scans cost \(O(\log i)\). \(n\le 10^5\) still allows that, but we can do better later.
Call bit_count (or repeated lowbit) on each \(i\) to fill the array.
1 2 3 | |
1 2 3 4 5 6 7 8 9 | |
1 2 3 4 5 6 7 8 9 10 | |
1 2 3 4 5 6 7 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
Solution 2
Thinking
Method 1 counts each integer from scratch. Clearing the lowest set bit yields \(i\&(i-1)\), whose answer is already known, so \(ans[i]=ans[i\&(i-1)]+1\). Fill upward in \(O(n)\).
1 2 3 4 5 6 | |
1 2 3 4 5 6 7 8 9 | |
1 2 3 4 5 6 7 8 9 10 | |
1 2 3 4 5 6 7 | |
1 2 3 4 5 6 7 | |