class Solution {
// 先排序,用一个外层循环遍历每个数,内层循环用双指针,时间复杂度是O(n2)
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
int n = nums.length;
Arrays.sort(nums);
for(int i = 0; i < n; i++){
if(i > 0 && nums[i] == nums[i - 1]) continue;
int l = i + 1, r = n - 1;
while(l < r){
int sum = nums[i] + nums[l] + nums[r];
if(sum < 0) l++;
else if(sum > 0) r--;
else{
res.add(Arrays.asList(nums[i], nums[l], nums[r]));
l++;
r--;
while(l < r && nums[l] == nums[l - 1]) l++;
while(l < r && nums[r] == nums[r + 1]) r--;
}
}
}
return res;
}
}