📌  相关文章
📜  来自给定数组的对和它们的按位 AND 的按位 AND 的总和(1)

📅  最后修改于: 2023-12-03 15:10:41.942000             🧑  作者: Mango

来自给定数组的对和它们的按位 AND 的按位 AND 的总和

本主题涉及到算法相关的概念,如“按位 AND”、“数组的对和”。以下将进行详细介绍。

按位 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 上的官方题解(英文 / 中文)。