leetcode
- 题目来源leetcode-15题:三数之和
- 题目描述:

思路:
- 先排序,再与0作比较
- 等于0,加入队列
- 小于0,begin右移
- 大于0,end左移
代码
const threeSum = function (nums) {
nums.sort((a, b) => a - b);
const res = [];
const len = nums.length;
for (let i = 0; i < len - 2; i++) {
if (i > 0 && nums[i] === nums[i - 1]) {
continue;
}
let sum = 0;
let begin = i + 1;
let end = len - 1;
while (begin < end) {
sum = nums[i] + nums[begin] + nums[end];
if (sum === 0) {
res.push([nums[i], nums[begin], nums[end]]);
while (nums[begin] === nums[begin + 1]) begin++;
while (nums[end] === nums[end - 1]) end--;
begin++;
end--;
} else if (sum < 0) {
while (nums[begin] === nums[begin + 1]) begin++;
begin++;
} else {
while (nums[end] === nums[end - 1]) end--;
end--;
}
}
}
return res;
};
四数之和

思路
- 双循环
- 用双指针找另外两个数
代码
/**
* @param {number[]} nums
* @param {number} target
* @return {number[][]}
*/
const fourSum = function (nums, target) {
nums.sort((a, b) => a - b);
const len = nums.length;
const res = [];
if (len < 4) return res;
for (let i = 0; i < len - 3; i++) {
// 防止重复
if (i > 0 && nums[i] === nums[i - 1]) continue;
// 当数组最小值和都大于target 跳出
if (nums[i] + nums[i + 1] + nums[i + 2] + nums[i + 3] > target) break;
// 当数组最大值和都小于target,说明i这个数还是太小,遍历下一个
if (nums[i] + nums[len - 1] + nums[len - 2] + nums[len - 3] < target) continue;
for (let j = i + 1; j < len - 2; j++) {
let sum = 0;
let begin = j + 1;
let end = len - 1;
// 防止重复
if (j - i > 1 && nums[j] === nums[j - 1]) continue;
while (begin < end) {
sum = nums[i] + nums[j] + nums[begin] + nums[end];
if (sum === target) {
res.push([nums[i], nums[j], nums[begin], nums[end]]);
while (nums[begin] === nums[begin + 1]) begin++;
while (nums[end] === nums[end - 1])end--;
begin++;
end--;
} else if (sum < target) {
// while (nums[begin] === nums[begin + 1]) begin++;
begin++;
} else {
// while (nums[end] === nums[end - 1])end--;
end--;
}
}
}
}
return res;
};
升级
如果把三个元素换成k个元素?
思考
- 难度太大,我放弃