import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param num int整型一维数组
* @return int整型ArrayList<ArrayList<>>
*/
public ArrayList<ArrayList<Integer>> threeSum (int[] num) {
// write code here
//边界值判断,数组长度小于3的返回空
int len = num.length;
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
if(len<3) return res;
//为了使用双指针方法,需要先对整个数组进行排序,方便指针移动比较大小
//对数组排序
Arrays.sort(num);
//依次遍历num的每个元素,利用双指针
for(int k=0;k<len-2;k++){
int flag = 0;
//因为升序排列,所以如果cur值大于0,则后面元素之和是不可能比它小的
int cur = num[k];
if(cur>0) return res;
//如果当前cur值和前面的cur值重复,则跳过这个cur值
for(int i=0;k>=1&&i<k;i++){
if(cur==num[i]) {
flag=1;
break;
}
}
if(flag==1) continue;
int i = k+1;
int j = len-1;
while(i<j){
if(cur+num[i]+num[j]>0){
j--;
}
else if(cur+num[i]+num[j]<0){
i++;
}
else{
ArrayList<Integer> temp = new ArrayList<>();
temp.add(cur);
temp.add(num[i]);
temp.add(num[j]);
res.add(temp);
//这里再判断两个指针是否也和前面重复
while(i<j && num[i+1]==num[i]) i++;
while(i<j && num[j-1]==num[j]) j--;
i++;
j--;
}
}
}
return res;
}
}