问题描述
小R正在研究位运算中的按位与操作。给定一个整数数组 nums,你需要找到数组中所有满足条件的 按位与三元组 的数目。按位与三元组是由下标 (i, j, k) 组成的三元组,满足以下条件:
0 <= i < nums.length0 <= j < nums.length0 <= k < nums.lengthnums[i] & nums[j] & nums[k] == 0,其中&表示按位与运算符。
请你返回所有这样的三元组的数目。
问题理解
我们需要找到数组 nums 中所有满足 nums[i] & nums[j] & nums[k] == 0 的三元组 (i, j, k) 的数目。这里的 & 表示按位与运算符。
数据结构选择
我们选择使用 defaultdict 来记录每个可能的按位与结果的出现次数。defaultdict 是一个字典,当访问一个不存在的键时,它会自动创建一个默认值(这里是 int,默认值为 0)。
算法步骤
- 预处理:遍历所有可能的两两组合
(i, j),计算nums[i] & nums[j]的结果,并记录在bit_and_count中。 - 检查三元组:遍历每个数
nums[i]和bit_and_count中的每个键key,检查nums[i] & key是否为0。如果满足条件,则将bit_and_count[key]的值加到总数中。
代码实现
ef solution(nums: list) -> int: from collections import defaultdict
# 记录每个可能的按位与结果的出现次数
bit_and_count = defaultdict(int)
# 遍历所有可能的两两组合,记录它们的按位与结果
for i in range(len(nums)):
for j in range(len(nums)):
bit_and_count[nums[i] & nums[j]] += 1
# 遍历所有可能的三元组,检查是否满足条件
count = 0
for i in range(len(nums)):
for key in bit_and_count:
if nums[i] & key == 0:
count += bit_and_count[key]
return count
if name == 'main': print(solution(nums=[2, 1, 3]) == 12) print(solution(nums=[0, 2, 5]) == 25) print(solution(nums=[1, 2, 4]) == 24) ### 关键点
- 按位与运算的特性:
a & b & c == 0意味着在二进制表示中,a、b和c的每一位中至少有一个是0。 - 组合的遍历:我们需要遍历所有可能的三元组
(i, j, k),并检查nums[i] & nums[j] & nums[k]是否为0。
思路提示
-
预处理:
-
我们可以先遍历所有可能的两两组合
(i, j),计算nums[i] & nums[j]的结果,并记录在bit_and_count中。 -
bit_and_count记录了每个可能的按位与结果的出现次数。 -
- 检查三元组:
-
遍历每个数
nums[i]和bit_and_count中的每个键key,检查nums[i] & key是否为0。 -
如果满足条件,则将
bit_and_count[key]的值加到总数中。
-