Learn DSA
Two Pointers
Sliding Window
Intervals
Stack
Linked List
Binary Search
Heap
Depth-First Search
Breadth-First Search
Backtracking
Graphs
Dynamic Programming
Greedy Algorithms
Trie
Prefix Sum
Matrices
3-Sum
DESCRIPTION (credit Leetcode.com)
Given an input integer array nums, write a function to find all unique triplets [nums[i], nums[j], nums[k]] such that i, j, and k are distinct indices, and the sum of nums[i], nums[j], and nums[k] equals zero. Ensure that the resulting list does not contain any duplicate triplets.
EXAMPLES
Input:
nums = [-1,0,1,2,-1,-1]
Output:
[[-1,-1,2],[-1,0,1]]
Explanation: Both nums[0], nums[1], nums[2] and nums[1], nums[2], nums[4] both include [-1, 0, 1] and sum to 0. nums[0], nums[3], nums[4] ([-1,-1,2]) also sum to 0.
Since we are looking for unique triplets, we can ignore the duplicate [-1, 0, 1] triplet and return [[-1, -1, 2], [-1, 0, 1]].
The order of the triplets and the order of the elements within the triplets do not matter.
Run your code to see results here
Solution
def threeSum(nums):nums.sort()result = []for i in range(len(nums) - 2):if i > 0 and nums[i] == nums[i - 1]:continueleft = i + 1right = len(nums) - 1while left < right:total = nums[i] + nums[left] + nums[right]if total < 0:left += 1elif total > 0:right -= 1else:result.append([nums[i], nums[left], nums[right]])while left < right and nums[left] == nums[left + 1]:left += 1while left < right and nums[right] == nums[right - 1]:right -= 1left += 1right -= 1return result
Explanation
def threeSum(nums):nums.sort()result = []for i in range(len(nums) - 2):if i > 0 and nums[i] == nums[i - 1]:continueleft = i + 1right = len(nums) - 1while left < right:total = nums[i] + nums[left] + nums[right]if total < 0:left += 1elif total > 0:right -= 1else:result.append([nums[i], nums[left], nums[right]])while left < right and nums[left] == nums[left + 1]:left += 1while left < right and nums[right] == nums[right - 1]:right -= 1left += 1right -= 1return result
Avoiding Duplicates
def threeSum(nums):nums.sort()result = []for i in range(len(nums) - 2):if i > 0 and nums[i] == nums[i - 1]:continueleft = i + 1right = len(nums) - 1while left < right:total = nums[i] + nums[left] + nums[right]if total < 0:left += 1elif total > 0:right -= 1else:result.append([nums[i], nums[left], nums[right]])while left < right and nums[left] == nums[left + 1]:left += 1while left < right and nums[right] == nums[right - 1]:right -= 1left += 1right -= 1return result
def threeSum(nums):nums.sort()result = []for i in range(len(nums) - 2):if i > 0 and nums[i] == nums[i - 1]:continueleft = i + 1right = len(nums) - 1while left < right:total = nums[i] + nums[left] + nums[right]if total < 0:left += 1elif total > 0:right -= 1else:result.append([nums[i], nums[left], nums[right]])while left < right and nums[left] == nums[left + 1]:left += 1while left < right and nums[right] == nums[right - 1]:right -= 1left += 1right -= 1return result
Avoiding Duplicates II
def threeSum(nums):nums.sort()result = []for i in range(len(nums) - 2):if i > 0 and nums[i] == nums[i - 1]:continueleft = i + 1right = len(nums) - 1while left < right:total = nums[i] + nums[left] + nums[right]if total < 0:left += 1elif total > 0:right -= 1else:result.append([nums[i], nums[left], nums[right]])while left < right and nums[left] == nums[left + 1]:left += 1while left < right and nums[right] == nums[right - 1]:right -= 1left += 1right -= 1return result
def threeSum(nums):nums.sort()result = []for i in range(len(nums) - 2):if i > 0 and nums[i] == nums[i - 1]:continueleft = i + 1right = len(nums) - 1while left < right:total = nums[i] + nums[left] + nums[right]if total < 0:left += 1elif total > 0:right -= 1else:result.append([nums[i], nums[left], nums[right]])while left < right and nums[left] == nums[left + 1]:left += 1while left < right and nums[right] == nums[right - 1]:right -= 1left += 1right -= 1return result
Termination
def threeSum(nums):nums.sort()result = []for i in range(len(nums) - 2):if i > 0 and nums[i] == nums[i - 1]:continueleft = i + 1right = len(nums) - 1while left < right:total = nums[i] + nums[left] + nums[right]if total < 0:left += 1elif total > 0:right -= 1else:result.append([nums[i], nums[left], nums[right]])while left < right and nums[left] == nums[left + 1]:left += 1while left < right and nums[right] == nums[right - 1]:right -= 1left += 1right -= 1return result
Loading comments...