Sort first. For each element, use two pointers to find pairs summing to its negative. Skip duplicates.
function threeSum(nums): sort(nums) result = [] for i in range(len(nums) - 2): if i > 0 and nums[i] == nums[i-1]: continue left = i + 1 right = len(nums) - 1 while left < right: total = nums[i] + nums[left] + nums[right] if total == 0: result.append([nums[i], nums[left], nums[right]]) while left < right and nums[left] == nums[left+1]: left += 1 while left < right and nums[right] == nums[right-1]: right -= 1 left += 1 right -= 1 elif total < 0: left += 1 else: right -= 1 return result
time, space.