给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。
示例 1:
输入: 2
输出: [0,1,1]
示例 2:
输入: 5
输出: [0,1,1,2,1,2]
思路:有点像找规律,对于任意一个不是2的整数幂(非0,2,4,8,16 ,32…)的数i
,1
的个数记为dp[i]
,则dp[i]=dp[j]+dp[i-j]
,j为比i小的最大的 2的整数幂 例: 若 i=15 则 j=8 i=7 j=4
对于2的指数幂的数 dp[i]=1
public int[] countBits(int num) {
int[] res=new int[num+1];
int flag=1;
for(int i=1;i<=num;i++){
if(i==1)
res[i]=1;
if(i/flag==2){
flag=i;
res[i]=1;
}
else
res[i]=res[flag]+res[i-flag];
}
return res;
}