Grokking the Engineering Manager Coding Interview

0% completed

Triplet Sum to Zero (medium)

Problem Statement

Given an array of unsorted numbers, find all unique triplets in it that add up to zero.

Examples

Example 1

  • Input: [-3, 0, 1, 2, -1, 1, -2]
  • Output: [[-3, 1, 2], [-2, 0, 2], [-2, 1, 1], [-1, 0, 1]]
  • Explanation: There are four unique triplets whose sum is equal to zero.

Example 2

  • Input: [-5, 2, -1, -2, 3]
  • Output: [[-5, 2, 3], [-2, -1, 3]]
  • Explanation: There are two unique triplets whose sum is equal to zero.

Constraints:

  • 3 <= arr.length <= 3000
  • -10<sup>5</sup> <= arr[i] <= 10<sup>5</sup>

.....

.....

.....

Like the course? Get enrolled and start learning!
D Delg

D Delg

· 3 years ago

I've read and watched a few videos on this problem and I really think it would be helpful if there was a good visual representation of what is going on. Especially when the "correct" solution here is very complicated and verbose.

N

Natasha Johnson

· 4 years ago

The code itself is pretty complicated, but this video gives a better visualization of how it works. Check it out: https://m.youtube.com/watch?v=PXpthXV1mmw

Show 4 replies
S

Satappa khot

· 3 years ago

/** Sort the array , iterate over the array by having left and right pointers and find the sum. */ public Set<List<Integer>> searchTriplets2(int[] array) { Arrays.sort(array); Set<List<Integer>> triplets = new HashSet<>(); // Iterate only length -2 since you cant make triplets with only 2 elements for (int i = 0; i < array.length - 2; i++) { // Left is 1 ahead of i when it starts int right = array.length - 1; // Right always starts from the end int left = i+1; while (left < right) { int currentSum = array[i] + array[left] + array[right]; if (currentSum == 0) { triplets.add(Arrays.asList(array[i], array[left], array[right])); left++; right--;
Show 1 reply
S

stephen

· 4 years ago

If you find a triplet on the first call to seach_pair you will get a list index error because right already equals the end of the list so right +1 is out of bounds.

Show 1 reply
R

Rex Zulfekar

· 3 years ago

The solution for this doesn't work, getting runtime errors for the Javascript version. Even if I copy the exact solution and paste it.

Show 2 replies
H

himanshu1495

· 3 years ago

class Solution:   def searchTriplets(self, arr):     triplets = []     # TODO: Write your code here     arr.sort()     n=len(arr)     for i in range(0,n-2):#go upto the third last element only       el=arr[i]       if i>0 and arr[i]==arr[i-1]:         continue       j=i+1       k=n-1       while(j<k):         #TODO: logic for skipping second element already chosen         el2=arr[j]         el3=arr[k]         if arr[j]+arr[k]==(0-el):           triplets.append([el,el2,el3])           j+=1           k-=1             while(j<k and arr[j]==el2):             j+=1           while(j<k and arr[k]==el3):             k-=1         elif arr[j]+arr[k]<(0-el):           j+=1           while(j<k and arr[j]==el2):             j+=1         else:           k-=1           while(j<k and arr[k
Show 1 reply
W

willumeh

· 2 years ago

So, I understand that we are taking a three sum and manipulating it to look similar to a two sum, there the sum will equal -targetsum , where targetsum is the item at index i. My question is why does the value to the left of index i not matter?

Show 1 reply
U

umesh

· a year ago

To form a triplet, you can chose first number in n ways. For each first number, second number can be chosen from the remaining n-1 numbers. But you don't get any choice for the third number, it must be -1*(first_num + second_num). Thus total of n*(n-1) or O(n^2) possibilities.

M

Mikhail Putilov

· 4 years ago

I cannot find an explanation why do we run searchPair method starting from i+1. Why do we just throw out left part of the array from 0 to i during searchPair?

Show 2 replies
P

Paul Montleau

· 4 years ago

Why is Example 1's output [-3, 1, 2], [-2, 0, 2], [-2, 1, 1], [-1, 0, 1] instead of [[-3, 1, 2], [-2, 0, 2], [-2, 1, 1], [-1, 0, 1]]?

Show 1 reply