给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
解题思路:
先将数组进行排序
从左侧开始,选定一个值为 定值 ,右侧进行求解,获取与其相加为 00 的两个值
类似于快排,定义首和尾
首尾与 定值 相加
等于 00,记录这三个值
小于 00,首部右移
大于 00,尾部左移
定值右移,重复该步骤
/**
* @param {number[]} nums
* @return {number[][]}
*/
var threeSum = function(nums) {
var res = [];
nums.sort((a, b) => a - b);
// 先从小到大进行排序,最左侧为定值,右侧所有值进行两边推进计算
var size = nums.length;
if (nums[0] <= 0 && nums[size-1] >= 0) {
// 保证有正负数
var i = 0;
while (i < size - 2) {
if (nums[i] > 0) break; // 最左侧大于0,无解
var first = i + 1;
var last = size - 1;
while (first < last) {
if (nums[i] * nums[last] > 0) break; //三数同符号,无解
var sum = nums[i] + nums[first] + nums[last];
if (sum == 0) {
res.push([nums[i], nums[first], nums[last]]);
}
if (sum < 0) {
// 负数过小,first右移
while (nums[first] === nums[++first]) {} //重复值跳过
} else {
while (nums[last] === nums [--last]) {}
}
}
while (nums[i] === nums[++i]) {}
}
}
return res;
};