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; // } // }