338. 比特位计数
题目:给你一个整数 n ,对于 0 <= i <= n 中的每个 i ,计算其二进制表示中 1 的个数 ,返回一个长度为 n + 1 的数组 ans 作为答案。
解题方法1 动态规划
1、思路:计数型动态规划----最高有效位
-
最高有效位
二进制表示中只有最高位是 1,其余都是 0,即一个正整数是不是 2 的整数次幂。 -
判断最高有效位
按位与运算:如果(n&(n-1))==0,则n是 2 的整数次幂。 -
转移方程:f[ i ] = f[ i - hightBit ] +f[ hightBit ]
f[ hightBit ] = 1 -
示例:i 和 i - hightBit 相比,i 的二进制表示只多了一个1
f[15] = f[7]+ f[8] = f[3]+ f[4] +f[8] = f[1]+f[2]+ f[4] +f[8] = 1+1+1+1
2、算法
(1) 确定状态:f[ i ] 表示 i 的二进制数中1的个数
(2) 转移方程:f[ i ] = f[ i - hightBit ] +1
(3) 初始条件: f[0]=0
(4) 计算顺序:f[0],f[1]…f[n]
3、java代码
class Solution {
public int[] countBits(int n) {
//确定状态:f[i] 表示 i 的二进制数中1的个数
int[] f = new int[n + 1];
//初始条件: f[0]=0
f[0]=0;
int highBi = 0;
//计算顺序:f[0],f[1]…f[n]
for (int i = 1; i <= n; i++) {
//判断hightBit的条件:
//(n&(n-1))==0:如果正整数y是2的整数次幂,则y的二进制表示中只有最高位是1
if ((i & (i - 1)) == 0) { //注意括号(i & (i - 1))
highBi = i;
}
//转移方程:f[i] = f[i-hightBit] +1
f[i] = f[i - highBi] + 1;
}
return f;
}
}