#刷题交流#
问题描述:
小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。
他们决定请你帮忙编写一个程序,计算符合这个条件的三元组数量。
测试样例:
样例1:
输入:a = [2, 2, 3, 1]
输出:2

样例2:
输入:a = [1, 3, 2, 2, 1]
输出:5

样例3:
输入:a = [1, 3, 2, 2, 1, 2]
输出:12
问题分析:
需要找到所有满足以下条件的三元组 (i, j, k):
0 <= i < j < k < n
max(a[i], a[j], a[k]) - min(a[i], a[j], a[k]) = 1
数据结构选择:
由于需要频繁地查找和比较元素,排序后的数组可以帮助我们更高效地找到满足条件的三元组。
算法步骤:
排序:首先对数组进行排序。排序后,数组中的元素会按照从小到大的顺序排列,这样可以简化后续的比较操作。
遍历:使用三重循环遍历数组,检查每个三元组是否满足条件。由于数组已经排序,我们可以确保 i < j < k 的条件自动满足。
条件检查:对于每个三元组 (a[i], a[j], a[k]),检查 max(a[i], a[j], a[k]) - min(a[i], a[j], a[k]) == 1。由于数组已经排序,max(a[i], a[j], a[k]) 和 min(a[i], a[j], a[k]) 可以直接通过 a[k] 和 a[i] 获得。在循环中,检查 a[k] - a[i] == 1,如果满足条件,则计数器 count 加一。
展开
评论