15. 3Sum
Problem
Tags: Array
, Two Pointers
, Sorting
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
-10^5 <= nums[i] <= 10^5
Code
JS
// 15. 3Sum (10/6/53764)
// Runtime: 136 ms (85.93%) Memory: 49.30 MB (94.83%)
/**
* @param {number[]} nums
* @return {number[][]}
*/
function threeSum(nums) {
nums.sort((a, b) => a - b);
const results = [];
for (let i = 0; i < nums.length - 2; i++) {
if (i > 0 && nums[i] === nums[i - 1]) continue;
let ptrL = i + 1,
ptrR = nums.length - 1;
while (ptrL < ptrR) {
const sum = nums[i] + nums[ptrL] + nums[ptrR];
if (sum === 0) {
results.push([nums[i], nums[ptrL++], nums[ptrR--]]);
while (ptrL < ptrR && nums[ptrL] === nums[ptrL - 1]) ptrL++;
while (ptrL < ptrR && nums[ptrR] === nums[ptrR + 1]) ptrR--;
} else if (sum < 0) ptrL++;
else ptrR--;
}
}
return results;
}