[LeetCode 338] 比特位计数
比特位计数
给你一个整数
n
,对于0 <= i <= n
中的每个i
,计算其二进制表示中1
的个数 ,返回一个长度为n + 1
的数组ans
作为答案
O(nlogn) 解法
顺序计算 n 个数二进制表示中的 1 的个数, 对于数字 i, 依次与 作与操作, 若结果为 1 则计数加 1.
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* countBits(int n, int* returnSize){
int* result = (int*) malloc(sizeof(int) * (n + 1));
*returnSize = n + 1;
memset (result, 0, sizeof(int) * (n+1));
for (int i = 0; i <= n; i++) {
for (int k = 1; k <= i; k *= 2) {
if ((i & k) > 0)
{
result[i] ++;
}
}
}
return result;
}
O(n) 解法
LeetCode 官方题解 tql
DP - 最高有效位
以 bits[i]
代表数字 i 二进制表示中的 1 的位数, 对于数字 , 是满足 的最大的 2 的幂, 设 z = x - y, 则
如果一个数字 是 2 的幂, 则有
function countBits(n: number): number[] {
var bits: number[] = new Array(n + 1);
bits[0] = 0;
var y:number = 1;
for (let x = 1; x <= n ; x++) {
if ((x & (x - 1)) == 0) {
y = x;
}
bits[x] = bits[x - y] + 1;
}
return bits;
};
DP-最低有效位
对于数字
function countBits(n: number): number[] {
let bits: number[] = new Array(n + 1);
bits[0] = 0;
for (let x: number = 1; x <= n; x++) {
if (x % 2 == 1) {
// x 是奇数
bits[x] = bits[Math.floor(x/2)] + 1;
} else {
// x 是偶数
bits[x] = bits[Math.floor(x/2)];
}
}
return bits;
};
DP-最低设置位
定义整数的二进制位最低的 1 所在位为最低设置位, 令 , 则 为将 的最低设置位从 1 变为 0 后的数字, 显然有 , bits[x] = bits[y] + 1
, 即 bits[x] = bits[x & (x-1)] + 1
.
function countBits(n: number): number[] {
let bits: number[] = new Array(n + 1);
bits[0] = 0;
for (let x = 1; x <= n; x++) {
bits[x] = bits[x & (x - 1)] + 1;
}
return bits;
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步