等于0的情况:0+0+0,正+负+0,正+正+负,正+负+负,所以三个相同的数能等于0的情况是只有3个0,所以重复的数有2个就够了,先通过hashmap去重,同一个数出现3次以上只取2次,有效次数和为新数组的长度。然后将新数组排序,正数之后不必计算了,通过三层循环计算和是否为0。

import java.util.*;
import java.util.stream.*;
public class Solution {
    public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
        ArrayList<ArrayList<Integer>> lists = new ArrayList<>();
        if(num.length<3)return lists;
//         hash
        Map<Integer,Integer> map = new HashMap<>();
        int size = 0;
        for(int i=0;i<num.length;i++){
            if(map.containsKey(num[i])){
                map.put(num[i],map.get(num[i])+1);
                if(map.get(num[i])<3)size++;
            }else{
                map.put(num[i],1);
                size++;
            }
        }
//         判断是否有3个0
        if(map.containsKey(0)&&map.get(0)>=3){
            ArrayList<Integer> list = new ArrayList<>();
            list.add(0);list.add(0);list.add(0);
            lists.add(list);  
        }
        int[] arr = new int[size];
        int m = 0;
        for(Integer key:map.keySet()){
            int count = map.get(key)>2?2:map.get(key);
            while(count>0){
                arr[m++] = key;
                count--;
            }
         }
       
        Arrays.sort(arr);
        for(int i=0;i<arr.length;i++){
            if(arr[i]>0)break;
            for(int j=i+1;j<arr.length;j++){
                for(int k=j+1;k<arr.length;k++){
                    ArrayList<Integer> list = new ArrayList<>();
                    if(arr[i]+arr[j]+arr[k]==0){
                        list.add(arr[i]);
                        list.add(arr[j]);
                        list.add(arr[k]);
                        if(!lists.contains(list))
                            lists.add(list);
                    }
                }
            }
         }
        return lists;
    }
}