4Sum
MediumArrayTwo PointersSorting
Solution
export function fourSum(nums: number[], target: number): number[][] {
nums.sort((a, b) => a - b);
const twoSum = (nums: number[], target: number): number[][] => {
const result: number[][] = [];
const set = new Set<number>();
nums.forEach((num) => {
if (result.length === 0 || result[result.length - 1][1] !== num) {
if (set.has(target - num)) {
result.push([target - num, num]);
}
}
set.add(num);
});
return result;
};
const kSum = (nums: number[], target: number, k: number): number[][] => {
const avg = Math.floor(target / k);
if (nums.length === 0 || avg < nums[0] || nums[nums.length - 1] < avg) {
return [];
}
if (k === 2) {
return twoSum(nums, target);
}
const result: number[][] = [];
nums.forEach((num, i) => {
if (i === 0 || nums[i - 1] !== num) {
for (const subset of kSum(nums.slice(i + 1), target - num, k - 1)) {
result.push([num, ...subset]);
}
}
});
return result;
};
return kSum(nums, target, 4);
}