力扣刷题(第七十天)

灵感来源 

- 保持更新,努力学习

- python脚本学习

比特位计数

解题思路

  1. 对于任意整数 x,其 1 的个数等于 x // 2 的 1 的个数加上 x % 2
  2. 状态转移方程:dp[x] = dp[x // 2] + (x % 2)
    class Solution:
        def countBits(self, n: int) -> List[int]:
            dp = [0] * (n + 1)
            for x in range(1, n + 1):
                # x // 2 对应 dp[x >> 1]
                # x % 2 对应 x & 1
                dp[x] = dp[x >> 1] + (x & 1)
            return dp

逐行解释

class Solution:
    def countBits(self, n: int) -> List[int]:
        # 创建结果数组,dp[x]表示数字x的二进制中1的个数
        # 初始时所有值都为0(因为dp[0]的1的个数为0)
        dp = [0] * (n + 1)
        
        # 遍历从1到n的每个数字
        for x in range(1, n + 1):
            # 关键状态转移方程:
            # 1. x >> 1 等价于 x // 2(右移一位,丢弃最低位)
            # 2. x & 1 等价于 x % 2(获取最低位的值)
            # 例如:
            # - 若x=5(二进制101),则x>>1=2(二进制10),x&1=1
            #   dp[5] = dp[2] + 1 = 1 + 1 = 2
            # - 若x=4(二进制100),则x>>1=2(二进制10),x&1=0
            #   dp[4] = dp[2] + 0 = 1 + 0 = 1
            dp[x] = dp[x >> 1] + (x & 1)
        
        return dp

你可能感兴趣的:(力扣每日打卡,leetcode,算法,职场和发展)