class Solution:
    def countBits(self, n: int) -> List[int]:
        res = [-1] * (n + 1)
        res[0] = 0
        nearest2 = 0
 
        for v in range(1, n + 1):
            # Could also be `nearest2 * 2 == v`
            if v & (v - 1) == 0:
                nearest2 = v
                res[v] = 1
                continue
            
            subv = v - nearest2
            res[v] = 1 + res[subv]
        
        return res

Complexity

Time:
Space: