Content
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
.
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? - Can you do it without using any built-in function (i.e., like
__builtin_popcount
in C++)?
Related Topics
Solution
1. 位运算
Java
class Solution {
public int[] countBits(int n) {
// 0 <= n <= 10⁵
int[] ans = new int[n + 1];
for (int i = 0; i <= n; i++) {
int j = i;
while (j > 0) {
ans[i] += j & 1;
j >>= 1;
}
}
return ans;
}
}
2. 动态规划
Java
class Solution {
public int[] countBits(int n) {
// 0 <= n <= 10⁵
int[] ans = new int[n + 1];
for (int i = 0; i <= n; i++) {
ans[i] = (i & 1) + ans[i >> 1];
}
return ans;
}
}
- counting-bits LeetCode counting bits 338counting-bits leetcode counting bits counting-bits leetcode 338 unreachable undirected leetcode count leetcode target count pairs occurrence leetcode common count leetcode number count pairs communicate leetcode servers count frequency leetcode counts tweet leetcode strings ranges count