解法一:动态规划

dp[i] 表示 i 的二进制形式中 1 的个数。因此有以下DP方程。
338. 比特位计数 - 图1
我的解法和官方题解的第二种是一个思路。

  1. class Solution {
  2. public int[] countBits(int num) {
  3. // dp[i]表示i的二进制形式中1的个数
  4. int[] dp = new int[num + 1];
  5. dp[0] = 0;
  6. for (int i = 1, x = 1; i <= num; ++i) {
  7. // i=2^k, dp[i]=1
  8. if (i == x) {
  9. dp[i] = 1;
  10. x <<= 1;
  11. } else {
  12. dp[i] = 1 + dp[i - (x >> 1)];
  13. }
  14. }
  15. return dp;
  16. }
  17. }

解法二:动态规划

参考官方题解的三、四两种方法。第三种我觉得还是可以想到的,第四种实在是太巧妙了。

  1. class Solution {
  2. public int[] countBits(int num) {
  3. // dp[i]表示i的二进制形式中1的个数
  4. int[] dp = new int[num + 1];
  5. for (int i = 1; i <= num; ++i) {
  6. dp[i] = dp[i >> 1] + (i & 1);
  7. }
  8. return dp;
  9. }
  10. }
  1. class Solution {
  2. public int[] countBits(int num) {
  3. // dp[i]表示i的二进制形式中1的个数
  4. int[] dp = new int[num + 1];
  5. for (int i = 1; i <= num; ++i) {
  6. dp[i] = dp[i & (i - 1)] + 1;
  7. }
  8. return dp;
  9. }
  10. }