给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例:
给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ]
/**
* 先排序,然后循环取一个数组元素,与分别指向首尾的双指针元素相加
* @param {number[]} nums
* @return {number[][]}
*/
var threeSum = function(nums) {
var sort = (arr) => {
for(var i = 0; i < arr.length - 1; i++){
for(var j = i + 1; j < arr.length; j++){
if(arr[i] > arr[j]){
var temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
return arr;
}
if(!nums.length || nums.length < 3) {
return [];
}
var result = [],
len = nums.length,
sortArr = sort(nums);
if(sortArr[0] > 0 || sortArr[len-1] < 0){
return [];
}
for(var i = 0; i < len; i++){
if(sortArr[i] > 0){
break; //首位>0
}
if(sortArr[i] == sortArr[i-1]){
continue; //去重
}
var left = i + 1,
right = len -1;
while(left < right){
var sum = sortArr[i] + sortArr[left] + sortArr[right];
if(sum == 0){
result.push([sortArr[i], sortArr[left], sortArr[right]]);
while(left < right && nums[left] == nums[left+1]){
left++; //去重
}
while(left < right && nums[right] == nums[right-1]){
right--;//去重
}
left++;
right--;
}else if(sum < 0){
left++;
}else{
right--;
}
}
}
return result;
};
← x的平方根-二分查找 两两交换链表中的节点 →