15. 3Sum
# O(n^2) time || O(1) space
def three_sum(self, nums: List[int]) -> List[List[int]]:
nums.sort()
res = []
for i in range(len(nums) - 2):
if i > 0 and nums[i] == nums[i - 1]:
continue
low, high = i + 1, len(nums) - 1
while low < high:
_sum = nums[i] + nums[low] + nums[high]
if _sum == 0:
res.append([nums[i], nums[low], nums[high]])
low, high = low + 1, high - 1
while low < high and nums[low] == nums[low - 1]:
low += 1
while low < high and nums[high] == nums[high + 1]:
high -= 1
elif _sum < 0:
low += 1
else:
high -= 1
return res
You can solve this problem using a sorting-based approach combined with the two-pointer technique. Here’s a step-by-step guide on how to do it:
- Sort the Array: First, sort the array in ascending order. This makes it easier to avoid duplicate triplets and use the two-pointer technique.
- Initialize a Result List: Create a list to store the triplets.
- Iterate Through the Array: Loop through the array with a for loop.
- Let’s call the current element
nums[i]
. For eachnums[i]
, you are going to find pairs of numbers in the subarraynums[i+1:]
that add up to-nums[i]
. - Two-Pointer Technique: Use two pointers, left and right, initialized at i+1 and len(nums) - 1, respectively. In each
iteration, check if
nums[i] + nums[left] + nums[right]
is 0.- If it is, add
[nums[i], nums[left], nums[right]]
to the result list, and move both pointers towards the center. - If the sum is less than 0, move the left pointer to the right.
- If the sum is greater than 0, move the right pointer to the left.
- If it is, add
- Avoid Duplicate Triplets: Ensure that you don’t add duplicate triplets to the result list. You can do this by skipping
over duplicate values of
nums[i]
,nums[left]
, andnums[right]
. - Return the Result: After the loop, return the result list.