按位与三元组问题

111 阅读2分钟

问题描述

小R正在研究位运算中的按位与操作。给定一个整数数组 nums,你需要找到数组中所有满足条件的 按位与三元组 的数目。按位与三元组是由下标 (i, j, k) 组成的三元组,满足以下条件:

  1. 0 <= i < nums.length
  2. 0 <= j < nums.length
  3. 0 <= k < nums.length
  4. nums[i] & nums[j] & nums[k] == 0,其中 & 表示按位与运算符。

请你返回所有这样的三元组的数目。

问题理解

我们需要找到数组 nums 中所有满足 nums[i] & nums[j] & nums[k] == 0 的三元组 (i, j, k) 的数目。这里的 & 表示按位与运算符。

数据结构选择

我们选择使用 defaultdict 来记录每个可能的按位与结果的出现次数。defaultdict 是一个字典,当访问一个不存在的键时,它会自动创建一个默认值(这里是 int,默认值为 0)。

算法步骤

  1. 预处理:遍历所有可能的两两组合 (i, j),计算 nums[i] & nums[j] 的结果,并记录在 bit_and_count 中。
  2. 检查三元组:遍历每个数 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) ### 关键点

  1. 按位与运算的特性a & b & c == 0 意味着在二进制表示中,ab 和 c 的每一位中至少有一个是 0
  2. 组合的遍历:我们需要遍历所有可能的三元组 (i, j, k),并检查 nums[i] & nums[j] & nums[k] 是否为 0

思路提示

  1. 预处理

    • 我们可以先遍历所有可能的两两组合 (i, j),计算 nums[i] & nums[j] 的结果,并记录在 bit_and_count 中。

    • bit_and_count 记录了每个可能的按位与结果的出现次数。

      1. 检查三元组
    • 遍历每个数 nums[i] 和 bit_and_count 中的每个键 key,检查 nums[i] & key 是否为 0

    • 如果满足条件,则将 bit_and_count[key] 的值加到总数中。