MUYANG GUO / INDEX

LeetCode

LeetCode 338 Counting Bits - Medium

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 represe…

·1 min read·#LeetCode#Medium#Python

338. Counting Bits — Medium

Open on LeetCode

Problem

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.

Solution

class Solution:
    def countBits(self, num: int) -> List[int]:
        ### DP 优化 O(n) Solution:
        ### 设 f[i] 表示 i 的二进制里有多少个 1
        ### 知识点, 二进制右移一位 即 mod 2 取整。
        
        ### transfer function: f[i] = f[i>>2] + (i mod 2)
        f = [0 for _ in range(num+1)]
        
        for i in range(1, num+1):
            f[i] = f[int(i / 2)] + (i % 2)
        
        return f

Comments