Three Numbers That Sum to Zero
Problem
Given an integer array, return every unique triplet (a, b, c) of indices where the values add to zero. The same triplet of values must appear at most once in the answer.
Sort the array. Fix one anchor i, then look for two values to its right that sum to −nums[i] using a left/right two-pointer sweep. Skip equal anchors and equal pointer moves to avoid duplicates.
Input
nums = [-2, -1, 0, 1, 2, -1]Output
[[-2, 0, 2], [-1, -1, 2], [-1, 0, 1]]def triplets_sum_to_zero(nums):
nums = sorted(nums)
out = []
for i in range(len(nums) - 2):
if i > 0 and nums[i] == nums[i - 1]:
continue
l, r = i + 1, len(nums) - 1
while l < r:
total = nums[i] + nums[l] + nums[r]
if total == 0:
out.append([nums[i], nums[l], nums[r]])
while l < r and nums[l] == nums[l + 1]:
l += 1
while l < r and nums[r] == nums[r - 1]:
r -= 1
l += 1
r -= 1
elif total < 0:
l += 1
else:
r -= 1
return out
function tripletsSumToZero(nums) {
nums = nums.slice().sort(function (a, b) { return a - b; });
const out = [];
for (let i = 0; i < nums.length - 2; i++) {
if (i > 0 && nums[i] === nums[i - 1]) continue;
let l = i + 1, r = nums.length - 1;
while (l < r) {
const sum = nums[i] + nums[l] + nums[r];
if (sum === 0) {
out.push([nums[i], nums[l], nums[r]]);
while (l < r && nums[l] === nums[l + 1]) l++;
while (l < r && nums[r] === nums[r - 1]) r--;
l++; r--;
} else if (sum < 0) l++;
else r--;
}
}
return out;
}
class Solution {
public List<List<Integer>> tripletsSumToZero(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> out = new ArrayList<>();
for (int i = 0; i < nums.length - 2; i++) {
if (i > 0 && nums[i] == nums[i - 1]) continue;
int l = i + 1, r = nums.length - 1;
while (l < r) {
int sum = nums[i] + nums[l] + nums[r];
if (sum == 0) {
out.add(List.of(nums[i], nums[l], nums[r]));
while (l < r && nums[l] == nums[l + 1]) l++;
while (l < r && nums[r] == nums[r - 1]) r--;
l++; r--;
} else if (sum < 0) l++;
else r--;
}
}
return out;
}
}
vector<vector<int>> tripletsSumToZero(vector<int> nums) {
sort(nums.begin(), nums.end());
vector<vector<int>> out;
for (int i = 0; i < (int)nums.size() - 2; i++) {
if (i > 0 && nums[i] == nums[i - 1]) continue;
int l = i + 1, r = nums.size() - 1;
while (l < r) {
int sum = nums[i] + nums[l] + nums[r];
if (sum == 0) {
out.push_back({nums[i], nums[l], nums[r]});
while (l < r && nums[l] == nums[l + 1]) l++;
while (l < r && nums[r] == nums[r - 1]) r--;
l++; r--;
} else if (sum < 0) l++;
else r--;
}
}
return out;
}