📅  最后修改于: 2023-12-03 14:50:44.375000             🧑  作者: Mango
在一个包含 $n$ 个元素的序列 $A$ 中,找到所有唯一的三元组 $(A_i, A_j, A_k)$,使得 $A_i + A_j + A_k = 0$。并且,每个元素仅被选择一次。
本题主要利用双指针的思想加以解决。
首先,对序列 $A$ 进行排序,再遍历排序后的序列,使用双指针 $l$ 和 $r$ 定义区间 $[i + 1, n - 1]$,然后在区间内使用双指针查找;
如果某个三元组满足 $A_i + A_j + A_k = 0$,则存储该三元组并且移动指针 $l$ 和 $r$;
如果 $A_i + A_j + A_k < 0$,说明当前三元组的和偏小,因此需要把左指针 $l$ 右移;
如果 $A_i + A_j + A_k > 0$,说明当前三元组的和偏大,因此需要把右指针 $r$ 左移。
最后返回所有唯一的三元组即可。
def threeSum(nums: List[int]) -> List[List[int]]:
n = len(nums)
nums.sort()
ans = []
for i in range(n):
if i > 0 and nums[i] == nums[i - 1]:
continue
l, r = i + 1, n - 1
while l < r:
if nums[i] + nums[l] + nums[r] == 0:
ans.append([nums[i], nums[l], nums[r]])
while l < r and nums[l] == nums[l + 1]:
l += 1
while l < r and nums[r] == nums[r - 1]:
r -= 1
l += 1
r -= 1
elif nums[i] + nums[l] + nums[r] < 0:
l += 1
else:
r -= 1
return ans