📅  最后修改于: 2023-12-03 15:10:41.942000             🧑  作者: Mango
本主题涉及到算法相关的概念,如“按位 AND”、“数组的对和”。以下将进行详细介绍。
按位 AND 是指将两个数字的二进制数进行逐位比较,只有在相应位上都为 1 时,结果这一位才为 1。示例如下:
a: 10101101
b: 11111000
a & b: 10101000
数组的对和是指取出数组中所有不同的数对,并计算这些数对的和。示例如下:
array: [1,2,3]
pairs: (1,2), (1,3), (2,3)
sum: 1+2+1+3+2+3 = 12
给定一个数组 nums,定义其“对和的按位 AND 的按位 AND 的总和”为:
$$\sum_{i<j} (nums_i & nums_j) & (nums_i & nums_j)$$
其中 $&$ 为按位 AND 运算。
以下为示例 Python 代码实现:
class Solution:
def totalHammingDistance(self, nums: List[int]) -> int:
n = len(nums)
ans = 0
for i in range(30):
c = sum(((x >> i) & 1) for x in nums)
ans += c * (n-c)
return ans * 2
以上实现的时间复杂度为 $O(n \log \max{a_i})$,其中 $n$ 为数组长度,$\max{a_i}$ 为数组中的最大值。算法的关键在于计算每一位上的贡献,即计算所有数对在这一位上的异或和。详细证明可参考 LeetCode 上的官方题解(英文 / 中文)。