import java.util.*; public class Solution {

  public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
        //存放最终答案的二维数组
      ArrayList<ArrayList<Integer>> ans = new ArrayList<>();
      int len = num.length;
       //特判:长度<3的数组不满足条件
      if(len<3){
          return ans;
      }
      //排序O(nlogn)
      Arrays.sort(num);

      for(int i=0;i<len;i++){
        //如果nums[i]已经大于0,就没必要继续往后了,因为和就是0啊
          if(num[i]>0){
              return ans;
          }
          //注意考虑越界i>0,主要功能是排除重复值
          if(i>0 && num[i]==num[i-1]){
              continue;
          }
          //声明指针
          int cur = num[i];
          int left = i+1;
            //从尾部开始
          int right =len-1;
          while(left<right){
            //满足条件的三数和
              int tp_ans = cur+num[left]+num[right];
            //如果已经找到和为0
             if(tp_ans==0){
                //创建一个数组,并将满足条件的三元素放进去
                 ArrayList<Integer> list = new ArrayList<>();
                 list.add(cur);
                 list.add(num[left]);
                 list.add(num[right]);
                //将最终的结果存入答案数组ans中
                 ans.add(list);
                 //判断是left指针指向是否重复
                while(left<right && num[left]==num[left+1]){
                    left++;
                }
                //判断是right指针指向是否重复
                 while(left<right && num[right]==num[right-1]){
                     right--;
                 }
                //移动指针
                 left++;
                 right--;
             }else if(tp_ans<0){
                 left++;
             }else{
                 right--;
             } 
          }
      }
      return ans;
  }

} // import java.util.*; // public class Solution { // public ArrayList<ArrayList> threeSum(int[] num) { // ArrayList<ArrayList> res = new ArrayList<>(); // if(num == null || num.length < 3) return res; // Arrays.sort(num); // int len = num.length; // int left = 0; // int right = len -1; // for(int i = 0;i < len-3;i++){ // if(num[i] > 0){ // return res; // } // if(i > 1 && num[i] == num[i-1]) continue; // left = i +1; // while(left < right){ // int temp = num[i] + num[left] + num[right] ; // if(temp == 0){ // ArrayList arr = new ArrayList<>(); // arr.add(num[i]); // arr.add(num[left]); // arr.add(num[right]); // res.add(arr); // }else if(temp > 0){ // right --; // }else if(temp < 0){ // left ++; // } // }

// } // return res; // } // }