003. 前n个数字二进制中1的个数

剑指 Offer II 003. 前n个数字二进制中1的个数 #

题目 #

  • 给定一个非负整数 n ,请计算 0n 之间的每个数字的二进制表示中 1 的个数,并输出一个数组。

思路 #

动态规划 #

  • z 为与 i 最接近的 2 的幂, 则 ans[i] = 1 + ans[i-z]
  • 问题转换为如何确定与某数最接近的 2 的幂

代码 #

动态规划 #

class Solution {
    public int[] countBits(int n) {
        int[] ans = new int[n+1];
        int pow = 1;
        for (int i = 1; i <= n; i++) {
            if (i == pow) {
                ans[i] = 1;
                pow *= 2;
            }
            else {
                ans[i] = 1 + ans[i - pow / 2];
            }
        }
        return ans;
    }
}

致谢 #

宫水三叶