3 Sum
Problem Statement
Given an integer array nums, return all the triplets [nums[i], nums[j], nums[k]]
such that i != j
, i != k
, and j != k
, and nums[i] + nums[j] + nums[k] == 0
.
Notice that the solution set must not contain duplicate triplets.
Example 1:
Input: nums = [-1,0,1,2,-1,-4]
Output: [[-1,-1,2],[-1,0,1]]
Explanation:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0.
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0.
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0.
The distinct triplets are [-1,0,1] and [-1,-1,2].
Notice that the order of the output and the order of the triplets does not matter.
Example 2:
Input: nums = [0,1,1]
Output: []
Explanation: The only possible triplet does not sum up to 0.
Example 3:
Input: nums = [0,0,0]
Output: [[0,0,0]]
Explanation: The only possible triplet sums up to 0.
Constraints:
3 <= nums.length <= 3000
105 <= nums[i] <= 105
Code
Python Code
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
res = set()
#1. Split nums into three lists: negative numbers, positive numbers, and zeros
n, p, z = [], [], []
for num in nums:
if num > 0:
p.append(num)
elif num < 0:
n.append(num)
else:
z.append(num)
#2. Create a separate set for negatives and positives for O(1) look-up times
N, P = set(n), set(p)
#3. If there is at least 1 zero in the list, add all cases where -num exists in N and num exists in P
# i.e. (-3, 0, 3) = 0
if z:
for num in P:
if -1*num in N:
res.add((-1*num, 0, num))
#3. If there are at least 3 zeros in the list then also include (0, 0, 0) = 0
if len(z) >= 3:
res.add((0,0,0))
#4. For all pairs of negative numbers (-3, -1), check to see if their complement (4)
# exists in the positive number set
for i in range(len(n)):
for j in range(i+1,len(n)):
target = -1*(n[i]+n[j])
if target in P:
res.add(tuple(sorted([n[i],n[j],target])))
#5. For all pairs of positive numbers (1, 1), check to see if their complement (-2)
# exists in the negative number set
for i in range(len(p)):
for j in range(i+1,len(p)):
target = -1*(p[i]+p[j])
if target in N:
res.add(tuple(sorted([p[i],p[j],target])))
return res