#3
Two Pointers
Two PointersGiven an integer array, return all unique triplets that sum to zero.
function threeSum(nums: number[]): number[][] {
const a = [...nums].sort((x, y) => x - y);
const res: number[][] = [];
for (let i = 0; i < a.length - 2; i++) {
if (i > 0 && a[i] === a[i - 1]) continue; // skip duplicate anchor
let lo = i + 1, hi = a.length - 1;
while (lo < hi) {
const sum = a[i] + a[lo] + a[hi];
if (sum === 0) {
res.push([a[i], a[lo], a[hi]]);
lo++; hi--;
while (lo < hi && a[lo] === a[lo - 1]) lo++; // skip dup values
while (lo < hi && a[hi] === a[hi + 1]) hi--;
} else if (sum < 0) lo++;
else hi--;
}
}
return res;
}def three_sum(nums)
a = nums.sort
res = []
(0..a.length - 3).each do |i|
next if i.positive? && a[i] == a[i - 1] # skip duplicate anchor
lo = i + 1
hi = a.length - 1
while lo < hi
sum = a[i] + a[lo] + a[hi]
if sum.zero?
res << [a[i], a[lo], a[hi]]
lo += 1
hi -= 1
lo += 1 while lo < hi && a[lo] == a[lo - 1] # skip dup values
hi -= 1 while lo < hi && a[hi] == a[hi + 1]
elsif sum.negative?
lo += 1
else
hi -= 1
end
end
end
res
end