322三数之和问题
题解
该问题要求在一个整数数组中找到所有满足 i < j < k
且 arr[i] + arr[j] + arr[k] == target
的三元组,并返回这些三元组的数量。由于可能存在大量的组合,结果需要对 $10^9 + 7$ 取模。
解题思路
- 排序数组:首先将数组进行排序,方便使用双指针法。
- 遍历数组:固定第一个数
arr[i]
,然后使用双指针j
和k
来查找剩下的两个数。 - 双指针查找:
- 如果
arr[i] + arr[j] + arr[k]
小于目标值,移动左指针j
以增大和。 - 如果大于目标值,移动右指针
k
以减小和。 - 当找到等于目标值的三元组时,需处理可能存在的重复元素:
- 如果
arr[j]
和arr[k]
相同,则可以从这段区间中任意选择两个数字组合。可以组合出(k - j + 1) * (k - j) / 2
个三元组。 - 否则,计算左右指针处相同元素的个数
l
和r
,并将l * r
加入结果中。
- 如果
- 如果
- 取模:在每次更新结果时,对结果取模以防止溢出。
代码
1 |
|
复杂度分析
- 时间复杂度:$O(n^2)$,其中 $n$ 是数组的长度。排序需要 $O(n \log n)$,双指针遍历需要 $O(n^2)$。
- 空间复杂度:$O(1)$,只使用了常数级别的额外空间。
322三数之和问题
https://kongshuilinhua.github.io/2024/12/30/322三数之和问题/