题意:
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
思路:
- 要求三个数的和是否为0,则可以对数组进行遍历,同时定义两个指针,不断进行移动。当三个数和为0时,则记录下这个值。
- 题目要求不能重复,则可以一开始对数组进行排序,再之后遍历i和移动指针start和end时,跳过与前面数值相等的数,因为是排序好的,所以相等的数会排在一起。且这样更好计算没有重复的三数的和
/**
* @param {number[]} nums
* @return {number[][]}
*/
var threeSum = function(nums) {
//数组排序
nums.sort(function(a,b){
return a-b
})
let result = []
//从数组开始遍历到length-2,遍历时要注意当前的数是否与前一个数相等
for(let i=0;i<nums.length-2;i++){
//定义两个指针,start=i+1,end=length-1,分别将两个指针放到当前遍历数的开始和末尾
//若相等,则跳过(去重)
//若不相等,则进行下一步操作
if(i===0 || nums[i]!==nums[i-1]){
let start = i+1
let end = nums.length-1
while(start<end){
//计算nums[i]+nums[start]+nums[end]的和:
//若===0,则说明找到了,返回结果
if((nums[i]+nums[start]+nums[end])===0){
result.push([nums[i],nums[start],nums[end]])
start++
end--
//start,end移动时也要注意比较是否与前一个数值相同,以便去除重复
while(start<end && nums[start]===nums[start-1] ){
start++
}
while(start<end && nums[end]===nums[end+1]){
end--
}
//若<0,start++,使得这个数组的和能变大
}else if((nums[i]+nums[start]+nums[end])<0){
start++
//若>0,end--,使得这个数组的和缩小
}else{
end--
}
}
}
}
return result
};