classSolution{publicList<List<Integer>>threeSum(int[]nums){intn=nums.length;Arrays.sort(nums);List<List<Integer>>ans=newArrayList<List<Integer>>();// 枚举 a a的值必须小于0 // a <= b <= cfor(intfirst=0;first<n&&nums[first]<=0;++first){// 需要和上一次枚举的数不相同 相等则跳出本次循环if(first>0&&nums[first]==nums[first-1]){continue;}// c 对应的指针初始指向数组的最右端intthird=n-1;inttarget=-nums[first];// 枚举 bfor(intsecond=first+1;second<n;++second){// 需要和上一次枚举的数不相同if(second>first+1&&nums[second]==nums[second-1]){continue;}// 需要保证 b 的指针在 c 的指针的左侧//循环找到满足相加等0的最大third值 注意这里的second没有变化while(second<third&&nums[second]+nums[third]>target){--third;}// 如果指针重合,随着 b 后续的增加// 就不会有满足 a+b+c=0 并且 b<c 的 c 了,可以退出循环if(second==third){break;}if(nums[second]+nums[third]==target){List<Integer>list=newArrayList<Integer>();list.add(nums[first]);list.add(nums[second]);list.add(nums[third]);ans.add(list);}}}returnans;}}