题目链接
英文链接:https://leetcode.com/problems/3sum-with-multiplicity/
中文链接:https://leetcode-cn.com/problems/3sum-with-multiplicity/
题目详述
给定一个整数数组 A
,以及一个整数 target
作为目标值,返回满足 i < j < k
且 A[i] + A[j] + A[k] == target
的元组 i, j, k
的数量。
由于结果会非常大,请返回 结果除以 10^9 + 7 的余数
。
示例 1:
1 | 输入:A = [1,1,2,2,3,3,4,4,5,5], target = 8 |
示例 2:
1 | 输入:A = [1,1,2,2,2,2], target = 5 |
提示:
3 <= A.length <= 3000
0 <= A[i] <= 100
0 <= target <= 300
题目详解
类似于 LeetCode15-三数之和,LeetCode15-三数之和 是求不重复的三元组,而本题是满足要求的三元组数量,可以重复。
方法一:双指针。
- 先对数组进行排序。
- 遍历数组,固定第一个数,对剩下的两个数运用双指针进行扫描。
- 注意计数的计算方法。
- 时间复杂度为 O(n^2)。
1 | public class LeetCode_00923 { |
- 由于数据范围在
0~100
之间,我们可以先对每个数出现次数进行统计。 - 再运用
i
、j
代表前两个数,求得第三个数k = targer - i -j
,i
、j
、k
三个数满足i <= j <= k <= 100
。 - 若
i = j = k
,则结果加上cnt[i] * (cnt[i] - 1) * (cnt[i] - 2) / 6
。 - 若
i = j < k
,则结果加上cnt[i] * (cnt[i] - 1) / 2 * cnt[k]
。 - 若
i < j = k
,则结果加上cnt[i] * cnt[j] * (cnt[j] - 1) / 2
。 - 若
i < j < k
,则结果加上cnt[i] * cnt[j] * cnt[k]
。 - 注意,需要在计算过程中防止溢出,可以转为
long
型计算。 - 时间复杂度为 O(n + w^2),w 代表数据范围最大值。
1 | public class LeetCode_00923 { |