0338. Counting Bits
https://leetcode.com/problems/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
.
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++)?
ac
class Solution {
public int[] countBits(int num) {
// edge cases
if (num < 0) throw new IllegalArgumentException("invalid input");
// dp
int[] dp = new int[num+1];
dp[0] = 0;
int base = 1;
for (int i = 1; i <= num; i++) {
if (i / base == 2) {
dp[i] = 1;
base = base << 1;
} else {
int idx = i % base;
dp[i] = dp[idx] + 1;
}
}
return dp;
}
}
/*
power
f[i]
state: f[i] bit counts at i point
func: 1) if i/pow(2, power) == 2, f[i] = 1, power++;
2) idx = i % pow(2, power), f[i] = f[idx] + 1;
init: f[0] = 0, power = 0
ans: f
*/
ac2: bit manipulation
class Solution {
public int[] countBits(int num) {
// edge case
if (num < 0) return new int[0];
int[] dp = new int[num+1];
for (int i = 1; i < dp.length; i++) {
dp[i] = dp[i>>1] + (i&1);
}
return dp;
}
}
ac3: bit manipulation
class Solution {
public int[] countBits(int num) {
// edge case
if (num < 0) return new int[0];
int[] dp = new int[num+1];
for (int i = 1; i < dp.length; i++) {
dp[i] = dp[i&(i-1)] + 1;
}
return dp;
}
}
Last updated
Was this helpful?