返回

Python 解决 leetcode 2176. Count Equal and Divisible Pairs in an Array(带详细注释)

后端

题目

给定一个整数数组 nums 和一个正整数 k,请您计算有多少个索引 ij 满足 0 <= i < j < nums.lengthnums[i] == nums[j](i * j) % k == 0

提示:

  • 1 <= nums.length <= 2 * 10^4
  • 1 <= nums[i] <= 10^4
  • 1 <= k <= 10^4

Python 解法

def count_equal_and_divisible_pairs(nums, k):
    """
    计算有多少个索引 i 和 j 满足 0 <= i < j < nums.length 且 nums[i] == nums[j] 且 (i * j) % k == 0。

    参数:
    nums: 给定的整数数组
    k: 正整数

    返回:
    满足条件的索引对数量
    """

    # 使用哈希表存储每个数字出现的次数
    num_counts = {}
    for num in nums:
        num_counts[num] = num_counts.get(num, 0) + 1

    # 统计满足条件的索引对数量
    count = 0
    for num, count in num_counts.items():
        # 如果 k 是偶数,并且 num 是 k 的一半,那么需要特殊处理,因为 (num * num) % k == 0
        if k % 2 == 0 and num == k // 2:
            count -= 1

        # 计算满足条件的索引对数量
        count += count * (count - 1) // 2

    return count


# 测试代码
nums = [3, 1, 2, 2, 2, 1, 3]
k = 2
result = count_equal_and_divisible_pairs(nums, k)
print(result)  # 输出:4

代码注释

  • 使用哈希表存储每个数字出现的次数:

    num_counts = {}
    for num in nums:
        num_counts[num] = num_counts.get(num, 0) + 1
    
    • num_counts 是一个哈希表,num 是数字,num_counts[num] 是数字出现的次数。
    • get() 方法用于获取哈希表中的值,如果键不存在,则返回默认值 0。
  • 统计满足条件的索引对数量:

    count = 0
    for num, count in num_counts.items():
        # 如果 k 是偶数,并且 num 是 k 的一半,那么需要特殊处理,因为 (num * num) % k == 0
        if k % 2 == 0 and num == k // 2:
            count -= 1
    
        # 计算满足条件的索引对数量
        count += count * (count - 1) // 2
    
    • count 是满足条件的索引对数量。
    • 对于每个数字 num,计算满足条件的索引对数量。
    • 如果 k 是偶数,并且 numk 的一半,那么需要特殊处理,因为 (num * num) % k == 0
    • 计算满足条件的索引对数量,使用公式 count += count * (count - 1) // 2,因为对于每个数字 num,最多可以与 count - 1 个其他数字形成满足条件的索引对。
  • 测试代码:

    nums = [3, 1, 2, 2, 2, 1, 3]
    k = 2
    result = count_equal_and_divisible_pairs(nums, k)
    print(result)  # 输出:4
    
    • 测试代码创建了一个整数数组 nums 和一个正整数 k,然后调用 count_equal_and_divisible_pairs() 函数计算满足条件的索引对数量。
    • 输出结果为 4,表示有 4 个索引对满足条件。