比特位计数
给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,
计算其二进制数中的 1 的数目并将它们作为数组返回。
题解:这种题如果不加限制的话可以选择移位&1的方式计算1的个数
但是要求是在O(N)的时间复杂度下完成就需要脑筋急转弯啦
0000 ---------> 0
0001 ---------> 1 ——————0000&0001=0000+1
0010 ---------> 1 ——————0001&0010=0000+1
0011 ---------> 2 ——————0010&0011=0010+1
0100 ---------> 1 ——————0011&0100=0000+1
0101 ---------> 2 ——————0100&0101=0100+1
0111 ---------> 3 ——————0101&0111=0101+1
使用&操作发现什么,0001中1个个数等于1&0后剩余的1的个数+1,此时问题就可以向小规模问题转化,因为&操作后i和i-1中1的结果说明i和i-1中有共同的比特位为1的
那么我们只需要找到&结果为dp[i&i-1]中1的个数,举例:
0100&0011->0000此时结果为0,那么我们去找0中1存在的个数=0
由于i和i-1在比特位上只相差1,所以每次+1就行
public class countBits {
public static int[] countBits(int num){
int n=1;
int[] dp=new int[num+1];
for (int i=1;i<=num;i++){
dp[n++]=dp[i&i-1]+1;
}
return dp;
}
}