class Solution(object):
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
nums.sort()
res, k = [], 0
for k in range(len(nums) - 2):
if nums[k] > 0: break # 1. because of j > i > k.
if k > 0 and nums[k] == nums[k - 1]: continue # 2. skip the same `nums[k]`.
i, j = k + 1, len(nums) - 1
while i < j: # 3. double pointer
s = nums[k] + nums[i] + nums[j]
if s < 0:
i += 1
while i < j and nums[i] == nums[i - 1]: i += 1
elif s > 0:
j -= 1
while i < j and nums[j] == nums[j + 1]: j -= 1
else:
res.append([nums[k], nums[i], nums[j]])
i += 1
j -= 1
while i < j and nums[i] == nums[i - 1]: i += 1
while i < j and nums[j] == nums[j + 1]: j -= 1
return res
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
if len(nums) < 3: return []
nums.sort()
ans, firstNum_set, ans_set = [], set(), set()
for i in range(len(nums) - 2):
base = nums[i]
if base not in firstNum_set:
firstNum_set.add(base)
target = 0 - base
left, right = i + 1, len(nums) - 1
if nums[left] + nums[left + 1] > target or nums[right] + nums[right - 1] < target: # 剪枝
continue
while left < right: # 双指针
if nums[left] + nums[right] == target:
if (base, nums[left], nums[right]) not in ans_set:
ans.append([base, nums[left], nums[right]])
ans_set.add((base, nums[left], nums[right]))
left += 1
right -= 1
elif nums[left] + nums[right] > target:
right -= 1
else:
left += 1
return ans