题目
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
要判断三个数相加之和为0,实际上可以通过将数组先进行一个排序,然后抽出其中一个数n,在另外的数中找出两个数相加等于抽出数的负数-n,这就简化了问题,只需要找出一个有序数组中相加等于-n的两个数即可
代码实现
var threeSum = function(nums) {
nums=insertSort(nums);
let len=nums.length;
let k=0;
let arr=[];
while(k<len-1){
let inArr=[];
let i=k+1;
let j=len-1;
while(i<j){
if(nums[k]==-(nums[i]+nums[j])){
inArr=[nums[k],nums[i],nums[j]];
for(let index=0;index<arr.length;index++){
if(compare(arr[index],inArr))
inArr=[];
}
if(inArr.length>0){
arr.push(inArr);
}
i++;
}else if(nums[k]>-(nums[i]+nums[j])){
j--;
continue;
}else{
i++;
}
}
k++;
}
return arr;
};
function insertSort(arr) {
let a = arr;
let len = a.length;
for (let i = len - 1; i >= 0; i--) {
let j = i;
let temp = a[j];
while (j + 1 < len && temp > a[j + 1]) {
a[j] = a[j + 1];
j++;
}
a[j] = temp;
}
return a;
}
function compare(arr1,arr2){
if(arr1.length!==arr2.length)
return false;
for(let i =0;i<arr1.length;i++){
if(arr1[i]!==arr2[i])
return false;
}
return true;
}