Given an array
nums
of n integers, are there elements a, b, c innums
such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.Note:
The solution set must not contain duplicate triplets.
Example:
Given array nums = [-1, 0, 1, 2, -1, -4], A solution set is: [ [-1, 0, 1], [-1, -1, 2] ]
思路:
先排序, 然后now指针从头开始遍历,取lo=now+1,hi=len-1:
如果nums[lo] + nums[hi] == -1*nums[now] 说明这组ok,加入结果数组里。然后lo++,hi--继续判断(要跳过重复),直到hi<lo
如果nums[lo] + nums[hi] < -1*nums[now]:lo++
nums[lo] + nums[hi] > -1*nums[now]:hi--
直到以now为开头的三元组都遍历完,now++(也要跳过重复)
/**
* @param {number[]} nums
* @return {number[][]}
*/
var threeSum = function(nums) {
nums.sort((a,b) => a-b);
var rst = [];
if(nums.length <3 || (nums.length==3&& nums.reduce((a,b)=>a+b)!=0)){
return rst;
}
if(nums.length == 3 && nums.reduce((a,b)=>a+b)==0){
rst.push([...nums])
return rst;
}
var len = nums.length;
var now = 0,lo=1,hi=len-1;
while(nums[now] <= 0){
while(lo < hi){
if(nums[lo] + nums[hi] == -1*nums[now]){
rst.push([nums[now],nums[lo],nums[hi]]);
//skip same array去重
while(nums[lo+1] == nums[lo]){
lo++;
}
while(nums[hi-1] == nums[hi]){
hi--;
}
lo++;
hi--;
}else if(nums[lo] + nums[hi] > -1*nums[now]){
hi--;
}else{
lo++;
}
}
while((now+1) <= (len-3) && nums[now+1] == nums[now]){
now++;
}
now++;
lo = now + 1;
hi = len - 1;
}
return rst;
};