3sum

Solution 1

  • Time complexity: O(n³)
  • Space complexity: O(n)
class Solution: def threeSum(self, nums: List[int]) -> List[List[int]]: n = len(nums) if n < 3: return [] res = [] sorted_nums = list(sorted(nums)) for i in range(n-2): for j in range(i+1, n-1): for k in range(j+1, n): if sorted_nums[i] + sorted_nums[j] + sorted_nums[k] == 0: if [sorted_nums[i], sorted_nums[j], sorted_nums[k]] not in res: res.append([sorted_nums[i], sorted_nums[j], sorted_nums[k]]) return res

Solution 2

  • Binary search (by sorting first)
    • Time complexity: O(n²)
    • Space complexity: O(n)
class Solution: def threeSum(self, nums: List[int]) -> List[List[int]]: # Time complexity: O(n^2) # Space complexity: O(n) n = len(nums) if n < 3: return [] res = [] sorted_nums = list(sorted(nums)) for i in range(n-2): if i > 0 and sorted_nums[i-1] == sorted_nums[i]: # Skip already found threeSum for a fixed sorted_nums[i] continue l, r = i+1, n-1 while l < r: threeSum = sorted_nums[i] + sorted_nums[l] + sorted_nums[r] if threeSum > 0: r -= 1 elif threeSum < 0: l += 1 else: res.append([sorted_nums[i], sorted_nums[l], sorted_nums[r]]) l += 1 while sorted_nums[l] == sorted_nums[l-1] and l < r: # Find all unique threeSum for a fixed sorted_nums[i] l += 1 return res