// import java.util.*; // public class Solution {

// public ArrayList<ArrayList> threeSum(int[] num) { // //存放最终答案的二维数组 // ArrayList<ArrayList> 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 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; for(int i = 0;i < len;i++){ if(num[i] > 0){ return res; } if(i > 0 && num[i] == num[i-1]) continue; left = i +1; int right = len -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); while(left < right && num[left] == num[left +1]){ left ++; } while(left < right && num[right] == num[right - 1]){ right --; } left ++; right --; }else if(temp > 0){ right --; }else if(temp < 0){ left ++; } }

    }
    return res;
}

}