説明タイトル:
配列NUMS N含む整数を考えるは、三つの要素NUMSよう+ B + C = 0 C、A、Bが存在するか否かを判断しますか?すべての条件が重複したトリプルを見つけることは満足していません。
注:答えは重複したトリプルを含めることはできません。
例:
给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
ソリューション:
暴力的な解決策:
/**
* @param {number[]} nums
* @return {number[][]}
*/
var threeSum = function(nums) {
var temp;
var array=[],array1=[];
for(let i=0;i<nums.length-1;++i){
for(let j=i+1;j<nums.length;++j){
temp=nums[i]+nums[j];
for(let k=0;k<nums.length;++k){
if(k!=i&&k!=j&&temp+nums[k]===0){
array1=[nums[i],nums[j],nums[k]];
var flag=true;
for(let n=0;n<array.length;++n){
if(array[n].sort().toString()===array1.sort().toString()){
flag=false;
}
}
if(flag){
array.push(array1);
}
}
}
}
}
return array;
};
II。配列のソート
/**
* @param {number[]} nums
* @return {number[][]}
*/
var threeSum = function(nums) {
var ans=[];
var len=nums.length;
if(nums == null || len < 3) return ans;
nums.sort((a,b)=>a-b);
for(let i=0;i<len;++i){
if(nums[i]>0){break;};
if(i>0&&nums[i]==nums[i-1]){
continue;
}
let L=i+1,R=len-1;
while(L<R){
const sum=nums[i]+nums[L]+nums[R];
if(sum===0){
ans.push([nums[i],nums[L],nums[R]]);
while(L<R&&nums[L]==nums[L+1]){L++;}
while(L<R&&nums[R]==nums[R-1]){R--;}
L++;
R--;
}
else if(sum>0){
R--;
}
else if(sum<0){
L++;
}
}
}
return ans;
};