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 1:
Input: 2
Output: [0,1,1]
Example 2:
Input: 5
Output: [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.
LeetCode:链接
想一想,当一个数为2的整数幂的时候,1的个数为1,比如2(10) 和4(100),8(1000)。在这之后就是前一个序列的数+1 比如 9(1001) = 1(1) + 8 (1) = 2。就是把一个数分解为小于它的最大2的整数幂 + x。
class Solution(object):
def countBits(self, num):
"""
:type num: int
:rtype: List[int]
"""
dp = [0] * (num + 1)
before, pow2 = 1, 1
for i in range(1, num+1):
if i == pow2:
before, dp[i] = i, 1
# 左移一位 1 2 4 8
pow2 <<= 1
else:
dp[i] = dp[before] + dp[i-before]
return dp