ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[LeetCode 338] 比特位计数

2022-08-04 19:02:25  阅读:140  来源: 互联网

标签:countBits mathbf 338 比特 int number let bits LeetCode


比特位计数

LeetCode 338

给你一个整数 n ,对于 0 <= i <= n 中的每个 i ,计算其二进制表示中 1 的个数 ,返回一个长度为 n + 1 的数组 ans 作为答案

O(nlogn) 解法

顺序计算 n 个数二进制表示中的 1 的个数, 对于数字 i, 依次与 \(2^k (2^k \le 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 的位数, 对于数字 \(x\), \(y\) 是满足 \(y \le x\) 的最大的 2 的幂, 设 z = x - y, 则

\[\mathbf{bits[x] = bits[z] + 1} \]

如果一个数字 \(x\) 是 2 的幂, 则有 \(x \& (x - 1) = 0\)

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-最低有效位

对于数字 \(x\)

\[\mathbf{bits[x]} = \begin{cases} \mathbf{bits[x/2]} & \mathbf{x} 是偶数 \\ \mathbf{bits[x/2]} + 1 & \mathbf{x} 是奇数 \end{cases} \]

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 所在位为最低设置位, 令 \(y = x \&(x-1)\), 则 \(y\) 为将 \(x\) 的最低设置位从 1 变为 0 后的数字, 显然有 \(0\le y< x\), 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;
};

标签:countBits,mathbf,338,比特,int,number,let,bits,LeetCode
来源: https://www.cnblogs.com/Corona09/p/16551658.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有