合法三元组数量计算 | 豆包MarsCode AI刷题

164 阅读3分钟

问题描述

小C、小U 和小R 三个好朋友喜欢做一些数字谜题。这次他们遇到一个问题,给定一个长度为n的数组a,他们想要找出符合特定条件的三元组 (i, j, k)。具体来说,三元组要满足 0 <= i < j < k < n,并且 max(a[i], a[j], a[k]) - min(a[i], a[j], a[k]) = 1,也就是说,最大值与最小值之差必须为1。
他们决定请你帮忙编写一个程序,计算符合这个条件的三元组数量。

 输入与输出

  • 输入:一个整数列表 a,例如 [2, 2, 3, 1]
  • 输出:返回一个整数,该整数表示满足特定条件的三元组的数量。

思考过程

在这个问题中,我们的主要任务是要从给定的整数列表中找出特定形式的三元组。这些三元组的具体形式可以表示为:

  • (num, num, num + 1)
  • (num, num + 1, num + 1) 我们希望找出所有这样的三元组并返回它们的总数。

解决方法

第一步:我们将利用 Python 的 collections 模块中的 Counter 类来帮助我们高效地统计可迭代对象中每个元素的出现次数,我们利用这个工具来统计数组中每个数字出现的频率 第二步:统计了每个数字的出现频率,我们将检查特定数字 num + 1 是否存在。通过这种方式,我们可以确保能够形成正确的三元组,并进行相关计算。

  • 三元组计算 : 对于每一个数字 num,我们将使用组合公式来计算两种类型的三元组数量,如下所述:

    1. 对于 (num, num, num + 1) 类型的三元组:

    • 我们需要有两个相同的 num 和一个 num + 1。通过组合公式,我们可以计算出这样的组合数量,其计算公式为:count[num] * (count[num] - 1) // 2 * count[num + 1]。这里,count[num] * (count[num] - 1) // 2 用于计算从数量为 count[num] 的元素中选择两个相同的元素的方式。
  1. 对于 (num, num + 1, num + 1) 类型的三元组:

    • 此时我们需要一个 num 和两个相同的 num + 1。相应的组合计数公式为:count[num] * count[num + 1] * (count[num + 1] - 1) // 2。在这个公式中,count[num] 是代表我们能选择的 num 的数量,而 count[num + 1] * (count[num + 1] - 1) // 2 是用来计算从数量为 count[num + 1] 的元素中选择两个相同元素的方法。

代码实现为:

def solution(a: list) -> int:
    from collections import Counter
    count = Counter(a)
    for num in count:
        if (num + 1) in count:
            if count[num] >= 2:
                total_triplets += count[num] * (count[num] - 1) // 2 * count[num + 1]

            if count[num + 1] >= 2:
                total_triplets += count[num] * count[num + 1] * (count[num + 1] - 1) // 2
    
    return total_triplets

if __name__ == '__main__':
    print(solution([2, 2, 3, 1]) == 2)
    print(solution([1, 3, 2, 2, 1]) == 5)
    print(solution([1, 3, 2, 2, 1, 2]) == 12)

通过 Python 的 Counter 类,我们可以非常高效地解决这个问题。该算法充分利用了计数和组合数学的原理,以快速确定满足条件的三元组数量。