算法---四数之和(leetcode第18题(leetcode.cn/problems/4s…)
解题思路及代码如下:
/*
* @description: 四数之和
* @params (array) nums
* @params (number) target
* @return (array) res
*/
function fourSum (nums, target) {
//定义一个结果集
const res = [];
const count = nums.length;
//四数之和,数组至少要有4项,否则直接返回空数组
if(count < 4) return res;
//给数组排序
nums.sort((a, b)=> a - b);
//开始循环
for(let i = 0; i < count - 3; i++) {
//有条件返回,当第一个数大于零且值大于target值的时候,直接返回空数组
if(nums[i] > 0 && nums[i] > target) {
return res;
}
//给nums[i]去重
if(i > 0 && nums[i] === nums[i-1]) {
continue;
}
for(let j = i + 1; j < count - 2; j++) {
//给nums[j]去重
if(j > i + 1 && nums[j] === nums[j-1]) {
continue;
}
//定义2个指针(left指向j+1项和right指向末尾项)
let left = j + 1, right = count - 1;
while(left < right) {
//定义四数之和(sum),是left和right指针移动的关键指标
const sum = nums[i] + nums[j] + nums[left] + nums[right];
if(sum > target) {
right--;
}else if(sum < target) {
left++;
}else {
//收集结果
res.push([nums[i], nums[j], nums[left], nums[right]]);
//给nums[left]去重
while(left < right && nums[left] === nums[left + 1]) {
left++;
}
//给nums[right]去重
while(left < right && nums[right] === nums[right - 1]) {
right--;
}
left++;
right--;
}
}
}
}
return res;
}