[Leetcode] 第338题 比特位计数
一、题目描述
给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。
示例 1:
输入: 2 输出: [0,1,1]
示例 2:
输入: 5
输出: [0,1,1,2,1,2]
二、题目分析
1)发现规律:2的幂1的数目一定是1个,用last_2记录最近出现的2的幂
2)dp[i]=1+dp[i-last_2],比如dp[7]=1+dp[3]
三、代码实现
1 class Solution { 2 public: 3 vector<int> countBits(int num) { 4 vector<int>res(num + 1); 5 res[0] = 0; 6 if (num < 1)return res; 7 res[1] = 1; 8 int last_2 = 1; 9 for (int i = 2; i <= num; ++i) { 10 if (i%last_2 == 0 && i / last_2 == 2) { 11 res[i] = 1; 12 last_2 = i; 13 } 14 else 15 res[i] = 1 + res[i - last_2]; 16 } 17 return res; 18 } 19 };