无脑解!!!(表示懒得思考,超时再考虑,然而没超时)

import java.util.*;
public class Solution {
    public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
        ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
        for(int i = 0; i < num.length - 2; ++i){
            for(int j = i + 1; j < num.length - 1; ++j){
                for(int k = j + 1; k < num.length; ++k){
                    if(num[i] + num[j] + num[k] == 0){
                        int a = Math.min(Math.min(num[i], num[j]), num[k]);
                        int c = Math.max(Math.max(num[i], num[j]), num[k]);
                        int b = 0 - a - c; 
                        boolean flag = false;
                        for(int m = 0; m < res.size(); ++m){
                            if(res.get(m).get(0) == a 
                              && res.get(m).get(1) == b
                              && res.get(m).get(2) == c){
                                flag = true;
                                break;
                            }
                        }
                        if(!flag){
                            ArrayList<Integer> tmp = new ArrayList<>();
                            tmp.add(a);tmp.add(b);tmp.add(c);
                            res.add(tmp);
                        }
                    }
                }
            }
        }
        for(int i = 1; i < res.size(); ++i){
            for(int j = 1; j < res.size() - i + 1; ++j){
                boolean flag = false;
                if(res.get(j - 1).get(0) > res.get(j).get(0)){
                    flag = true;
                }else if(res.get(j - 1).get(0) == res.get(j).get(0)
                         && res.get(j - 1).get(1) > res.get(j).get(1)){
                    flag = true;
                }else if(res.get(j - 1).get(0) == res.get(j).get(0)
                         && res.get(j - 1).get(1) == res.get(j).get(1)
                         && res.get(j - 1).get(2) > res.get(j).get(2)){
                    flag = true;
                }
                if(flag){
                    swap(res.get(j), res.get(j - 1), 0);
                    swap(res.get(j), res.get(j - 1), 1);
                    swap(res.get(j), res.get(j - 1), 2);
                }
            }
        }
        return res;
    }
    public void swap(ArrayList<Integer> arrI,ArrayList<Integer> arrJ, int index){
        int temp = arrI.get(index);
        arrI.set(index, arrJ.get(index));
        arrJ.set(index, temp);
    }
}

用脑解,先排个序,固定一个值,转化成求两个数的和,过滤相同的用map偷懒。

import java.util.*;
public class Solution {
    public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
        for(int i = 1; i < num.length; ++i){
            for(int j = 1; j < num.length - i + 1; ++j){
                if(num[j - 1] > num[j]){
                    int temp = num[j - 1];
                    num[j - 1] = num[j];
                    num[j] = temp;
                }
            }
        }
        ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
        Map<String, Boolean> map = new HashMap<>();
        for(int i = 0; i < num.length - 2; ++i){
            int left = i + 1, right = num.length - 1;
            while(left < right){
                int sum = num[left] + num[right];
                if(sum == -num[i]){
                    String key = num[i]+","+num[left]+","+num[right];
                    if(!map.containsKey(key)){
                        map.put(key, true);
                        ArrayList<Integer> tmp = new ArrayList<>();
                        tmp.add(num[i]); tmp.add(num[left]); tmp.add(num[right]);
                        res.add(tmp);
                    }
                    ++left;
                    --right;
                }else if(sum > -num[i]){
                    --right;
                }else{
                    ++left;
                }
            }
        }
        return res;
    }
}