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三数之和问题/