Skip to main content

3Sum

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]]

Example 2:

Input: nums = []Output: []

Example 3:

Input: nums = [0]Output: []

Constraints:

  • 0 <= nums.length <= 3000
  • -105 <= nums[i] <= 105

My solution

/**
* @param {number[]} nums
* @return {number[][]}
*/
var threeSum = function(nums) {
const sortedNums = nums.sort((a, b) => a- b);

const results = [];

// console.log(sortedNums);

for (let i = 0; i < sortedNums.length - 2; i++) {
if (i === 0 || (i > 0 && sortedNums[i] !== sortedNums[i - 1])) {
let sum = 0 - sortedNums[i];
let left = i + 1;
let right = sortedNums.length - 1;

while (left < right) {
const innerSum = sortedNums[left] + sortedNums[right];
if (innerSum === sum) {
// console.log(sum, innerSum, left, right)
results.push([sortedNums[i], sortedNums[left], sortedNums[right]])
while (left < right && sortedNums[left] === sortedNums[left + 1]) {
left++;
}
while (left < right && sortedNums[right] === sortedNums[right - 1]) {
right--;
}
left++;
right--;
} else if(innerSum > sum) {
right--;
} else {
left++
}
}
}
}

return results;
};