/** *

  • 把数组按正数(包括0)和负数分成两个数组,分别排序,然后再建一个哈希表(数为key,数组的索引为值);分别遍历(两层)正数数组和负数数组,用0减去这两个数,看得到的key是否存在于哈希表中,存在,就找到了一个组合,这里要注意0的特殊情况。前面尽量避免了重复,但是最后结果还是要去重,重新排序。 这个写法时间复杂度还可以,但是空间占用多,而且代码比较长 */ function threeSum( num ) { // write code here if(num.length<3){ return []; }

    let res=[]; let positive=[]; let negative=[]; let hm={};

    for(let i=0;i<num.length;i++){ if(num[i]>=0){ positive.push(num[i]); } else{ negative.push(num[i]); }

     hm[num[i]]=i;
    

    }

    positive.sort((a,b)=>{ return a-b}); negative.sort((a,b)=>{ return a-b});

    for(let i=0;i<positive.length;i++){

     hm[positive[i]]=i;
    

    } for(let i=0;i<negative.length;i++){

     hm[negative[i]]=i;
    

    }

    for(let i=0;i<negative.length-1;i++){ if(i>0&&negative[i]==negative[i-1]){ continue; } for(let j=i+1;j<negative.length;j++){

         let key=0-(negative[i]+negative[j]);
         if(hm[key] != undefined){
             res.push([negative[i],negative[j],key]);
         }
    
     }
    

    }

    for(let i=0;i<positive.length-1;i++){ if(i>0&&positive[i]==positive[i-1]){ continue; } for(let j=i+1;j<positive.length;j++){

         let key=0-(positive[i]+positive[j]);
         if(hm[key] != undefined){
             if(key==0){
                  if(hm[key]!=i && hm[key]!=j){
                      res.push([key,positive[i],positive[j]]);
                  }
             }
             else{
                 res.push([key,positive[i],positive[j]]);
             }
         }
     }
    

    } let temp=res; res=[]; for(let i=0;i<temp.length;i++){ if(i==0){ res.push(temp[i]); continue; } if(temp[i][0]==temp[i-1][0]&&temp[i][1]==temp[i-1][1]&&temp[i][2]==temp[i-1][2]){ continue; } res.push(temp[i]);

    } return res.sort((a,b)=>{ if(a[0]==b[0]){ if(a[1]==b[1]){ return a[2]-b[2] } else{ return a[1]-b[1] } } else{ return a[0]-b[0]; } });

} module.exports = { threeSum : threeSum };