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 <= 10^5
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 time O(n) and possibly in a single pass?
Can you do it without using any built-in function (i.e., like __builtin_popcount in C++)?
Solution
o ( n log n ) o(n \log n) o(nlogn)
Use n & (n - 1)
to delete the rightest 1 from n
, and count the number of 1
for every number.
Time complexity:
o
(
n
log
n
)
o(n \log n)
o(nlogn)
Space complexity:
o
(
1
)
o(1)
o(1)
o ( n ) o(n) o(n)
For even numbers, the rightest digit is always 0. So if you move the number to right by 1 bit, the number of 1
doesn’t change. But if it’s an odd number, the rightest digit is 1
, so add this 1
to the number.
If we use dp[i]
to denote the number of 1
of number i
, then: dp[i] = dp[i >> 1] + (i % 2)
Time complexity:
o
(
n
)
o(n)
o(n)
Space complexity:
o
(
n
)
o(n)
o(n)
Code
o ( n log n ) o(n \log n) o(nlogn)
class Solution:
def countBits(self, n: int) -> List[int]:
res = []
for i in range(n + 1):
cnt = 0
while i > 0:
i = i & (i - 1)
cnt += 1
res.append(cnt)
return res
o ( n ) o(n) o(n)
class Solution:
def countBits(self, n: int) -> List[int]:
dp = [0] * (n + 1)
for i in range(1, n + 1):
dp[i] = dp[i >> 1] + (i % 2)
return dp