一、题目

二、思路
dp+位运算,刚上来可能有点懵,但沉下心想一下也是有规律的。
如果对位运算比较熟悉的话,我们知道,一个数*2在二进制中就是左移一位,一个数/2就是右移一位。一个奇数所表示的二进制中,1的个数是永远比上一个偶数的二进制中1的个数多1个的;一个偶数所表示的二进制中,这个偶数/2,即右移一位,他的1的个数不会发生变化的。
总结一下,n为奇数时,二进制表示的n中的1比上一个偶数多1;n为偶数时,二进制表示的1的个数和n/2表示的二进制中1的个数相同。
三、代码
/**
* 找规律:
* 当n为奇数时:二进制表示的n比之前的偶数多个1,
* 例如3=101,2=100
* 当n为偶数时:二进制表示的n/2后和n中1的个数相同
* 例如12=1100,6=110,3=11
*/
class Solution {
public int[] countBits(int n) {
int[] res = new int[n + 1];
res[0] = 0; //初始化0=0,含有0个1
for (int i = 1; i <= n; i++) {
if (i % 2 == 1) { //奇数
res[i] = res[i - 1] + 1;
} else { //偶数
res[i] = res[i / 2];
}
}
return res;
}
}
位运算与DP求解二进制1计数
本文介绍了一种结合动态规划与位运算的方法来解决二进制中1的计数问题。通过观察奇偶数的二进制特性,利用位运算简化计算流程,高效求解0到n范围内所有整数二进制表示中1的个数。
223

被折叠的 条评论
为什么被折叠?



