源题目

https://leetcode-cn.com/problems/3sum/

15. 三数之和

难度中等3639
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 _a + b + c = _0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。

示例 1:
输入:nums = [-1,0,1,2,-1,-4] 输出:[[-1,-1,2],[-1,0,1]]
示例 2:
输入:nums = [] 输出:[]
示例 3:
输入:nums = [0] 输出:[]

提示:

  • 0 <= nums.length <= 3000
  • -105 <= nums[i] <= 105

    1. class Solution {
    2. /**
    3. * @param Integer[] $nums
    4. * @return Integer[][]
    5. */
    6. function threeSum($nums) {
    7. $len = count($nums);
    8. if(!$nums || $len <3) return [];
    9. $ret = [];
    10. sort($nums);
    11. for($i =0; $i < $len; $i++){
    12. if($nums[$i] > 0) continue;
    13. if($i > 0 && $nums[$i-1] == $nums[$i]) continue;
    14. $left = $i + 1;
    15. $right = $len -1;
    16. while($left < $right){
    17. $sum = $nums[$i] + $nums[$left] + $nums[$right];
    18. if($sum == 0){
    19. $ret[] = [$nums[$i] , $nums[$left] , $nums[$right]];
    20. while($left < $right && $nums[$left] == $nums[$left + 1]) $left ++;
    21. while($left < $right && $nums[$right -1] == $num[$right]) $right --;
    22. $left ++;
    23. $right --;
    24. }else if($sum > 0){
    25. $right --;
    26. }else{
    27. $left ++;
    28. }
    29. }
    30. }
    31. return $ret;
    32. }
    33. }