public static ArrayList<ArrayList<Integer>> fourSumTwo(int[] num, int target) {
        ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
        if (num == null || num.length < 4) {
            return res;
        }

        Arrays.sort(num);
        
        HashSet<ArrayList<Integer>> hashSet = new HashSet<ArrayList<Integer>>();
        
        for (int i = 0; i <= num.length - 4; i ++) {
            for (int j = i + 1; j <= num.length - 3; j ++) {
                for (int k = j + 1, h = num.length - 1; k < h;) {
                    int sum = num[i] + num[j] + num[k] + num[h];
                    
                    if (sum < target) {
                        k ++;
                        continue;
                    }
                    
                    if (sum > target) {
                        h --;
                        continue;
                    }
                    
                    ArrayList<Integer> tmp = new ArrayList<Integer>();
                    tmp.add(num[i]);
                    tmp.add(num[j]);
                    tmp.add(num[k]);
                    tmp.add(num[h]);
                    
                    if (! hashSet.contains(tmp)) {
                        hashSet.add(tmp);
                        res.add(tmp);
                    }
                    k ++;
                    h --;
                }
            }
        }
        
        return res;
    }