题目
首先最简单的解法就是遍历每个数去转二进制计1的个数
在要求时间复杂度为On的情况下需要运用dp思路
我们例举一些二进制数可以发现 001 010 011 100 101 110 111 1000 1001…
我们可以发现其中的规律 如果当前数为奇数 则1的个数为前一个偶数1的个数+1,如果当前数为偶数 则1 的个数等于 当前数/2 的1的个数
public int[] countBits(int num) {
int[] dp = new int[num+1];
dp[0] = 0;
for (int i = 1; i <= num; i++) {
if (i % 2 != 0)
dp[i] = dp[i-1]+1;
else
dp[i] = dp[i/2];
}
return dp;
}