比特位计数(leetcode-338)

题目

给定一个非负整数\(num\)。对于\(0 \leq i \leq num\)范围中的每个数字 \(i\),计算其二进制数中的 \(1\) 的数目并将它们作为数组返回。

示例 1:
输入: 2
输出: [0,1,1]

示例 2:
输入: 5
输出: [0,1,1,2,1,2]

思路

动态规划。题目要求O(n),很显然第一反应递推。假设\(f(n)\)为数字n的二进制形式中\(1\)的个数,那么我们需要找\(f(n)与f(0),f(1)...f(n-1)\)的关系。从二进制可以看出
0:000
1:001
2:010
3:011

如果一个数能被2整除,那么\(f(n)=f(n//2)\);如果一个数不能被2整除,那么\(f(n) = f(n-1)+1\)

这就是递推关系。

代码

class Solution:
    def countBits(self, num: int) -> list:
        dp = [0] # 保存结果
        for i in range(1, num + 1):
            if i % 2 == 0:
                dp.append(dp[i // 2])
            else:
                dp.append(dp[i - 1] + 1)
        return dp
posted @ 2020-10-28 17:02  Destiny233  阅读(56)  评论(0)    收藏  举报