import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param num int整型一维数组
* @return int整型ArrayList<ArrayList<>>
*/
public ArrayList<ArrayList<Integer>> threeSum (int[] num) {
// 先排序
Arrays.sort(num);
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
for (int i = 0; i < num.length; i++) {
// 相同的数已判断过,直接跳过
if (i > 0 && num[i] == num[i - 1]) {
continue;
}
// 以O(n)时间复杂度计算两数之和,双指针
int target = 0 - num[i];
int left = i + 1;
int right = num.length - 1;
while (left < right) {
// 相同数已判断过,跳过
if (left > i + 1 && num[left] == num[left - 1]) {
left++;
continue;
}
if (right < num.length - 1 && num[right] == num[right + 1]) {
right--;
continue;
}
int sum = num[left] + num[right];
// 找到一个答案
if (sum == target) {
ArrayList<Integer> ans = new ArrayList<>();
ans.add(num[i]);
ans.add(num[left]);
ans.add(num[right]);
res.add(ans);
left++;
continue;
}
// 如果和比目标小,右移左指针,否做左移右指针
if (sum < target) {
left++;
}else {
right--;
}
}
}
return res;
}
}