返回
LeetCode 923. 3Sum With Multiplicity (Python 实现)
后端
2023-10-31 15:11:14
问题
给定一个整数数组 A,其中可能有重复元素,我们的目标是计算满足如下条件的三元组 (i, j, k) 的数目:
- 0 <= i < j < k < A.length
- A[i] + A[j] + A[k] == 0
Python 解法
这种题目的核心思路是利用哈希表记录数组中每一个值出现的次数。因为存在重复元素,所以可以通过此方法来处理。
通过哈希表记录每一个数字出现的次数,通过三个 for 循环,逐一计算三个数字的和,以及这三个数字在哈希表中出现的次数,将它们组合起来累加,即是结果。
使用语言:Python
from collections import defaultdict
def threeSumMulti(A, target):
# 存储数字出现的次数
freq = defaultdict(int)
for num in A:
freq[num] += 1
# 对数组去重并排序
unique_nums = sorted(set(A))
# 初始化结果
count = 0
# 逐一计算三个数字的和
for i, num_i in enumerate(unique_nums):
# 如果三个数字都为同一个数字
if num_i * 3 == target and freq[num_i] >= 3:
count += freq[num_i] * (freq[num_i] - 1) * (freq[num_i] - 2) // 6
# 如果两个数字相等
elif num_i * 2 == target and freq[num_i] >= 2:
count += freq[num_i] * (freq[num_i] - 1) // 2
# 一般情况
else:
# 计算第三个数字
num_k = target - num_i - num_i
if num_k in freq:
count += freq[num_i] * freq[num_k]
return count
# 测试用例
A = [1, 1, 2, 2, 3, 3, 4, 4, 5, 5]
target = 8
print(threeSumMulti(A, target)) # 输出:20
总结
在解决 LeetCode 923 时,我们的重点是巧妙地利用哈希表记录数字出现的次数,并利用三个 for 循环来计算所有满足条件的三元组。通过这种方法,我们能够有效地处理重复元素的情况并计算出符合题目要求的三元组数量。对于类似的三数之和问题,这种方法能够提供一种灵活而高效的解决方案。