给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。
示例 1:
输入: 2
输出: [0,1,1]
1、题目分析
从题目中的二进制数能够比较明显的看出该题目属于位操作型动态规划,同时属于计数型的动态规划
2、确定状态
这个的最后一步应该很好理解,就是它的最后一位二进制位,举个例子:
170=10101010,它的最后一位是0,去掉它的最后一位则剩下的数就是85=1010101。
因此我们如果要求170的二进制有多个1,只需要求出去掉它的最后一位之后的85的二进制有多少个1,然后加上刚刚去掉的那位。如果去掉的那位是1的话则,170的1的个数就等于85的一个的个数+1;如果是0,则170的1的个数就等于85 的个数。然而要知道最后一位是1还是0 ,只需要该数除以2即可判断
3、转移方程
假设f[i]表示i的二进制中有多少个1
4、初始条件和边界情况
初始条件:f[0]=0
5、计算顺序
同样是从小到大计算,因为计算f[i]的1的个数,需要知道f[i/2]的1的个数
6、代码实现
class Solution:
def countBits(self, num: int) -> List[int]:
dp = [0 for i in range(num+1)]
for i in range(1,num+1):
if i%2==1:
dp[i]=dp[i//2]+1
else:
dp[i]=dp[i//2]
return dp