前 n 个数字二进制中 1 的个数
题干
给定一个非负整数 n ,请计算 0 到 n 之间的每个数字的二进制表示中 1 的个数,并输出一个数组。
示例:
输入: n = 2
输出: [0,1,1]
解释:
0 --> 0
1 --> 1
2 --> 10
思路
从单纯的暴力出发,统计每个数字中1的个数。
进一步优化,借助动态规划,借助上一个数字计算当前数字中1的个数
动态规划方程
i为奇数 dp[i] = dp[i-1]+1
i为偶数 dp[i] = dp[i/2]
实现
class Solution {
public int[] countBits(int n) {
int[] dp = new int[n+1];
for(int i=1; i<n+1; i++){
if(i%2==0){
dp[i] = dp[i>>1];
}
else{
dp[i] = dp[i-1]+1;
}
}
return dp;
}
}
浙公网安备 33010602011771号