📌  相关文章
📜  唯一三元组的最大数量,以使每个元素仅被选择一次(1)

📅  最后修改于: 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