📅  最后修改于: 2023-12-03 14:53:39.546000             🧑  作者: Mango
给定一个整数数组,计算其中有多少对元素,使得这对元素每个元素都具有相等的二进制设置位。例如,对于数组 [10, 11, 12, 13, 14, 15],我们可以计算有多少对元素,使得它们每个元素都具有相等的设置位:其中有两对:(10, 14) 和 (11, 13)。
利用位运算符来比较每一个数字的每一位是否相等,若相等再加入我们的哈希表但不同的数字可以具有相同的位数,这样我们将使用一个哈希映射,它将计数所有具有相同位数的数字中的数字数。对于数字 x,它将位于x 的条目中,因此增加计数器时,我们将在记录哈希映射中或者(自行)使用一个哈希表。这将为我们提供的信息有助于缩小最小的聚合范围。
时间复杂度: O(n logn),空间复杂度: O(n)
我们可以把数组中的每个数字二进制位上的 0 和 1 看成数字,分别对应数组的 0 和 1。然后,我们可以遍历所有的数字,将每个数字对应到对应的二进制位上。对于每个数字,我们需要知道这个数字的计数值,所以我们可以使用一个数组来存放每个数字的计数值。当我们处理输入数组时,对于每个数字,我们可以计算它二进制位上的数字,并将其累加到数组的对应数字中。最后,我们可以统计存在多少对数字具有相同的计数值。
时间复杂度: O(n),空间复杂度: O(n)
def countPairs(nums):
def getBitCounts(number):
count = 0
while number:
if number & 1:
count += 1
number >>= 1
return count
hashMap = {}
res = 0
for num in nums:
count = getBitCounts(num)
res += hashMap.get(count, 0)
hashMap[count] = hashMap.get(count, 0) + 1
return res
def countPairs(nums):
maxbits = 0
for num in nums:
maxbits = max(maxbits, num.bit_length())
freq = [0] * (maxbits + 1)
for num in nums:
freq[num.bit_length()] += 1
res = 0
for num in nums:
for i in range(maxbits + 1):
if (num ^ (1 << i)) in nums:
res += freq[num.bit_length()]
return res
本题可以使用位运算法和数组映射法来解决。两种方法的时间复杂度分别是 O(nlogn) 和 O(n),空间复杂度都是 O(n)。根据实际情况选择使用哪种方法。