题目:
给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):
0 <= a, b, c, d < na、b、c和d互不相同nums[a] + nums[b] + nums[c] + nums[d] == target
你可以按 任意顺序 返回答案 。
思路:
两个for循环,内嵌一个while循环,双指针,加每层优化
代码:
var fourSum = function (nums, target) {
//前两个数枚举,后两个数双指针
//排序
nums.sort((a, b) => a - b);
let res = [];
let len = nums.length;
for (let a = 0; a < len - 3; a++) {
if (a > 0 && nums[a] === nums[a - 1]) continue;
//优化一
if (nums[a] + nums[a + 1] + nums[a + 2] + nums[a + 3] > target) break;
//优化二
if (nums[a] + nums[len - 1] + nums[len - 2] + nums[len - 3] < target) continue;
for (let b = a + 1; b < len - 2; b++) {
if(b > a+ 1 && nums[b] === nums[b-1])continue;
//优化一
if (nums[a] + nums[b] + nums[b + 1] + nums[b + 2] > target) break;
//优化二
if (nums[a] + nums[b] + nums[len - 1] + nums[len - 2] < target) continue;
let c = b + 1;
let d = len - 1;
while (c < d) {
const sum = nums[a] + nums[b] + nums[c] + nums[d];
if (sum > target) {
d--;
} else if (sum < target) {
c++;
} else {
res.push([nums[a], nums[b], nums[c], nums[d]]);
c++;
while (c < d && nums[c] === nums[c - 1]) {
c++;
}
d--;
while (c < d && nums[d] === nums[d + 1]) {
d--;
}
}
}
}
}
return res;
};