题目:
给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。
class Solution {
public:
vector<int> countBits(int n)
{
// 动态规划
// 1、确定 dp[i] 数组的含义:数字 i 的二进制位含有 1 的个数
// 2、确定递推公式
// 如果 i&1 = 0, 则 dp[i] = dp[i>>1],即它含有 1 的个数和其算术右移结果相同
// 如果 i&1 = 1, 则 dp[i] = dp[i-1] + 1
// 3、dp 数组初始化 dp[0] = 0
// 4、确定遍历顺序
// 5、举例推导 dp 数组
vector<int> dp(n + 1, 0);
for (int i = 1; i <= n; ++i)
{
if((i & 1) == 0) dp[i] = dp[i >> 1];
else dp[i] = dp[i - 1] + 1;
}
return dp;
}
};