力扣刷题(第七十天)
灵感来源
- 保持更新,努力学习
- python脚本学习
比特位计数
解题思路
- 对于任意整数
x
,其1
的个数等于x // 2
的1
的个数加上x % 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 & 1dp[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 = 1dp[x] = dp[x >> 1] + (x & 1)return dp