案例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]] :::

  1. public List<List<Integer>> threeSum(int[] nums) {
  2. Arrays.sort(nums); // 排序去重
  3. List<List<Integer>> res = new ArrayList<>();
  4. for(int k = 0;k < nums.length-2;k++){
  5. if(nums[k] > 0) continue;
  6. if(k > 0 && nums[k] == nums[k-1]) continue;
  7. int i = k+1,j = nums.length-1; // 固定 k
  8. while(i < j){
  9. int sum=nums[i]+nums[k]+nums[j];
  10. if(sum < 0){
  11. i++;
  12. }
  13. else if(sum > 0){
  14. j--;
  15. }
  16. else{ // sum = 0 的 如果i < j 情况 i 继续前进
  17. res.add(Arrays.asList(nums[k], nums[i], nums[j]));
  18. while(i < j && nums[i] == nums[++i]); //相同的元素去重
  19. }
  20. }
  21. }
  22. return res;
  23. }