题目
难度:⭐️
给你一个包含 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]]
示例 2:
输入:nums = []
输出:[]
示例 3:
输入:nums = [0]
输出:[]
提示:
0 <= nums.length <= 3000
-105 <= nums[i] <= 105
题解
/**
* @param {number[]} nums
* @return {number[][]}
*/
var threeSum = function(nums) {
const result = [];
nums.sort(function(a, b){
return a - b;
})
for(let i = 0; i < nums.length-2; i++){
if(i === 0 || nums[i] !== nums[i-1]){
let start = i+1;
let end = nums.length-1;
while(start<end){
if(nums[i]+nums[start]+nums[end] === 0){
result.push([nums[i], nums[start], nums[end]]);
start ++;
end --;
while(start < end && nums[start] === nums[start-1]){
start ++
}
while(start < end && nums[end] === nums[end+1]){
end --
}
}else if(nums[i]+nums[start]+nums[end] < 0){
start ++;
}else{
end --
}
}
}
}
return result
};
笔记
此类型题目,可以先给数组排序,然后遍历数组,从0遍历到length-2(防止数组溢出)
如果当前的数字等于前一个数字,则跳过这个数(避免结果相同)
如果数字不同,则设置start=i+1,end=length-1,查看i,start和end三个数的和比零大还是小,如果比0小,start++,如果比0大,end--,如果等于0,把这三个数加入到结果里
最后返回结果