📅  最后修改于: 2023-12-03 15:12:02.556000             🧑  作者: Mango
在一个给定的整数数组中,如果两个数的二进制表示中仅包含1,那么就认为这是一对“设置位组成的对”,编写程序计算该数组中所有这样的对的总和。
对于每个元素,我们可以将其转换为二进制,然后检查其二进制位,如果该位为1且在另一个元素的相应二进制位上也为1,则将其加入对总和中。由于该算法需要枚举所有可能的对,因此时间复杂度为$O(n^2)$。
以下是基于Python的实现示例:
def count_ones_pairs(nums: List[int]) -> int:
n = len(nums)
ans = 0
for i in range(n):
for j in range(i + 1, n):
if bin(nums[i] & nums[j]).count('1') == bin(nums[i]).count('1') == bin(nums[j]).count('1'):
ans += 1
return ans
以上代码使用了Python中的位运算符和字符串计数函数count
。使用位运算符&
可以方便地获取两个二进制数的按位与结果,使用字符串函数count
可以方便地统计字符串中出现的特定字符数量。
以下是一种优化的方案:
首先可以预处理每个数中包含的1的数目,然后将所有数按其包含的1的数目分类。然后对于每个分类,尝试将其与上一个和下一个分类中的元素进行匹配。在该方案中,我们使用哈希表来存储每个分类中的元素。
具体实现方式如下:
def count_ones_pairs(nums: List[int]) -> int:
ones = [bin(i).count('1') for i in nums]
mp = defaultdict(list)
for i in range(len(nums)):
mp[ones[i]].append(nums[i])
ans = 0
for k, v in mp.items():
if k < 2:
continue
for i in range(len(v)):
for j in range(i + 1, len(v)):
if v[i] & v[j] == v[i] ^ v[j]:
ans += 1
return ans
在以上代码中,defaultdict
是一个方便的Python内置数据结构,它允许我们轻松地创建默认值为一个空列表的哈希表。当需要添加新元素时,如果该元素的键不存在,则创建一个新列表并将该元素添加到该列表中。
该算法的时间复杂度为$O(n\log n)$。虽然它比最初的算法具有更高的时间复杂度,但在大多数情况下,它的效率更高,因为它避免了枚举所有可能的组合。