class Solution {
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> ans = new ArrayList<>();
int n = nums.length;
for (int i = 0; i < n-2; i++) {
int x = nums[i];
if (i > 0 && x == nums[i-1]) continue;
if (x + nums[i+1] + nums[i+2] > 0) break;
if (x + nums[n-1] + nums[n-2] < 0) continue;
int j = i + 1;
int k = n - 1;
while (j < k) {
int s = x + nums[j] + nums[k];
if (s > 0) {
k--;
} else if (s < 0) {
j++;
} else {
ans.add(List.of(x, nums[j], nums[k]));
j++;
k--;
while (j < k && nums[j] == nums[j-1]) {
j++;
}
while (k > j && nums[k] == nums[k+1]) {
k--;
}
}
}
}
return ans;
}
}
- 有两层循环,第一层枚举第一个数,第二层双指针向内进行查找
- 解决重复问题:先进行排序,对于外层nums[i]和nums[i-1]进行比较,如果相同直接continue跳过,内层的nums[i]和nums[j]也是如此比较跳过重复部分
- 两个优化,如果if (x + nums[i+1] + nums[i+2] > 0) break;如果紧邻的两个数相加都>0说明后面更大的数肯定更大,就没必要再比较了;if (x + nums[n-1] + nums[n-2] < 0) continue;如果这个最外层的nums[i]和最大的两个数都还<0,说明最外层的这个数字需要变得更大,直接continue进行下一个计算