题目链接
英文链接: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 <= 30000 <= A[i] <= 1000 <= 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 { |