public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
ArrayList<List<Integer>> result = new ArrayList<>();
int n = nums.length;
for (int i = 0; i < n; i++) {
if (i != 0 && nums[i] == nums[i - 1]) continue;
int p = i + 1;
int q = n - 1;
while (p < q) {
if (p >= i + 2 && nums[p] == nums[p - 1]) {
p++;
continue;
}
if (q <= n - 2 && nums[q] == nums[q + 1]) {
q--;
continue;
}
int sum = nums[p] + nums[q];
if (sum == -1 * nums[i]) {
ArrayList<Integer> resultItem = new ArrayList<>();
resultItem.add(nums[i]);
resultItem.add(nums[p]);
resultItem.add(nums[q]);
result.add(resultItem);
p++;
q--;
} else if (sum < -1 * nums[i]) {
p++;
} else {
q--;
}
}
}
return result;
}