第二种方法与第一种方法的区别在于:将三数之和转成两数之和
第一种方法:
const threeSum = (nums) => {
if(nums.length < 2) {
return [];
}
nums.sort((a, b) => a - b);
const res = [];
for(let i = 0; i < nums.length - 2; i++) {
if(nums[i] > 0) {
break;
}
if(i >= 1 && nums[i] === nums[i - 1]) {
continue;
}
let left = i + 1;
let right = nums.length - 1;
while(left < right) {
const sum = nums[i] + nums[left] + nums[right];
if(sum === 0) {
res.push([nums[i], nums[left], nums[right]])
while(left < right && nums[left] === nums[left + 1]) {
left++;
}
while(left < right && nums[right] === nums[right - 1]) {
right--;
}
left++;
right--;
} else if(sum > 0) {
right--;
} else {
left++;
}
}
}
return res;
};
第二种方法
const threeSum = (nums) => {
if(nums.length < 2) {
return [];
}
nums.sort((a, b) => a - b);
const res = [];
for(let i = 0; i < nums.length - 2; i++) {
if(nums[i] > 0) {
break;
}
if(i >= 1 && nums[i] === nums[i - 1]) {
continue;
}
let target = 0 - nums[i];
let left = i + 1;
let right = nums.length - 1;
while(left < right) {
if(nums[left] + nums[right] === target) {
res.push([nums[i], nums[left], nums[right]])
while(left < right && nums[left] === nums[left + 1]) {
left++;
}
while(left < right && nums[right] === nums[right - 1]) {
right--;
}
left++;
right--;
} else if(nums[left] + nums[right] < target) {
left++;
} else {
right--;
}
}
}
return res;
};
来源: