双指针法

  public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
        ArrayList<ArrayList<Integer>> res = new ArrayList<>();
        Arrays.sort(num);
        for (int i = 0; i < num.length-2; i++) {
            if(i!=0&&num[i]==num[i-1]){//加该判断的目的是防止结果中出现重复的三元组,注意逻辑与运算符只有前面为true,才判断后面是否为true,若前面为false,则直接返回false,不再判断
                continue;
            }
            int left = i+1;
            int right = num.length-1;
            while (left<right){
                int target = num[left]+num[right];
                if(target>-num[i]){
                    right--;
                }else if(target<-num[i]){
                    left++;
                }else {
                    ArrayList<Integer> list = new ArrayList<>();
                    list.add(num[i]);
                    list.add(num[left]);
                    list.add(num[right]);
                    res.add(list);
                  //防止出现重复的三元组
                    while (num[left]==num[left+1]&&left+1<right){left++;}
                    while (num[right]==num[right-1]&&left<right-1){right--; }
                    left++;
                    right--;
                }
            }
        }
        return res;
    }