338. 比特位计数
   
    给定一个非负整数
    
     num
    
    。对于
    
     0 ≤ i ≤ num
    
    范围中的每个数字
    
     i
    
    ,计算其二进制数中的 1 的数目并将它们作为数组返回。
   
    
     示例 1:
    
   
输入: 2
输出: [0,1,1]
    
     示例 2:
    
   
输入: 5
输出: [0,1,1,2,1,2]
    
     进阶:
    
   
- 
     给出时间复杂度为
 
 O(n*sizeof(integer))
 
 的解答非常容易。但你可以在线性时间
 
 O(n)
 
 内用一趟扫描做到吗?
- 
     要求算法的空间复杂度为
 
 O(n)
 
 。
    你能进一步完善解法吗?要求在C++或任何其他语言中不使用任何内置函数(如 C++ 中的
    
     __builtin_popcount
    
    )来执行此操作。
   
解题思路1:对0~n的二进制数中的 1分别计数,添加到列表即可。
Python3代码如下:
class Solution(object):
    def countBits(self, num):
        """
        :type num: int
        :rtype: List[int]
        """
        result = []
        for n in range(num+1):
            counter = 0
            while n:
                counter += n & 1
                n >>= 1
            result.append(counter)
        return result
     
   
    
     解题思路2:利用整数n与整数n>>1的二进制数中的 1的数量的关系。整数n的二进制数中的 1的数量=整数n>>1的二进制数中的 1的数量+整数n的二进制数的最低位。动态规划的思想:dp[i] = dp[i>>1] + i & 1.
    
   
Python3代码如下:
class Solution(object):
    def countBits(self, num):
        """
        :type num: int
        :rtype: List[int]
        """
        result = [0]
        for n in range(1,num+1):
            result.append((n&1)+result[n>>1])
        return result
     
   
 
版权声明:本文为qq_36309480原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
