案例1 三数之和【核心排序+固定分类讨论】
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
:::info
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
:::
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums); // 排序去重
List<List<Integer>> res = new ArrayList<>();
for(int k = 0;k < nums.length-2;k++){
if(nums[k] > 0) continue;
if(k > 0 && nums[k] == nums[k-1]) continue;
int i = k+1,j = nums.length-1; // 固定 k
while(i < j){
int sum=nums[i]+nums[k]+nums[j];
if(sum < 0){
i++;
}
else if(sum > 0){
j--;
}
else{ // sum = 0 的 如果i < j 情况 i 继续前进
res.add(Arrays.asList(nums[k], nums[i], nums[j]));
while(i < j && nums[i] == nums[++i]); //相同的元素去重
}
}
}
return res;
}