题目:
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例 1:
输入:nums = [-1,0,1,2,-1,-4] 输出:[[-1,-1,2],[-1,0,1]]
关键思路:
本题的关键理解点在于:
1)排序避免重复计算
2)三数和 = cur + 求两数和
3)cur 为1的时候,求两数和的范围为[cur+1, len-1],类似排列组合。1,2,3 2,1,3是一样的
关键点:答案中不可以包含重复的三元组,靠排序跳过循环来规避。
解:
var threeSum = function (nums) {
if (!nums || nums.length < 3) {
return [];
}
const res = [];
nums.sort((a, b) => a - b)
for (let i = 0; i < nums.length; i++) {
if (nums[i] > 0) { //如果当前值大于0,由于升序,不会再存在解。
return res;
}
if (i > 0 && nums[i] === nums[i - 1]) { // 如果当前值和当前值前一个值相等,直接跳过
continue
}
let l = i + 1;
let r = nums.length - 1;
// 对于每一个当前值,向左向右找
while (l < r) {
if (nums[i] + nums[l] + nums[r] === 0) {
res.push([nums[i], nums[l], nums[r]]);
// l指针右移
// r指针左移
// 注意,规避相同值,继续找
while (l < r && nums[l] === nums[l + 1]) {
++l;
}
while (l < r && nums[r] === nums[r - 1]) {
--r;
}
++l;
--r;
} else if (nums[i] + nums[l] + nums[r] > 0) {
// cur + min + R > 0, R值大了
r--;
} else {
l++;
}
}
}
return res;
};
———— 前端、Javascript实现、算法、刷题、leetcode