18. 四数之和
var fourSum = function(nums, target) {
// 长度是常数
const n = nums.length;
let result = [];
// 当元素少于4的时候,返回空
if(nums == null || n < 4) return result;
// 元素进行升序排列,这样可以根据相加结果进行移动.注意js中sort的写法
nums.sort((a,b) => a - b);
// 固定指针i,j在最左边,最小的两块。然后移动指针L,R在j+1, n-1的位置。
// 两个固定指针,所以两层循环
for(let i=0;i<n;i++){
// 进行第一次去重操作,判断i当前元素是否重复。重复就结束这次循环,开启下一次循环。
if (i > 0 && nums[i] == nums[i-1]) continue;
for(let j=i+1; j<n; j++){
// 注意这里是j>i+1,即检查之前的元素,向后看。只是j>1是不行的。
if (j>i+1 && nums[j] == nums[j-1]) continue;
let L = j + 1;
let R = n - 1;
while(L < R){
const sum = nums[i] + nums[j] + nums[L] + nums[R];
// 和为0时
if(sum-target == 0){
result.push([nums[i],nums[j],nums[L],nums[R]]);
// 第二次去重操作。当和为0的时候,防止L和R的重复元素出现
while(L < R && nums[L] == nums[L+1]) L++;
while(L < R && nums[R] == nums[R-1]) R--;
// 和为0,移动L和R指针
L++;
R--;
}
// 和不为0,移动L和R,使得和为0.
// 大于0,代表大于0的值太大了,需要调小
else if(sum-target > 0) R--;
else if(sum-target < 0) L++;
}
}
}
return result;
};