# [LeetCode 15] 翻译翻译,什么叫双指针(震声)

其实就是翻译了一下官方题解。不得不说,这个双指针还是巧妙啊。

function threeSum(nums: number[]): number[][] {
  const res: number[][] = [],
    length = nums.length;
  nums.sort((a, b) => a - b);
  for (let first = 0; first < length; ++first) {
    if (first && nums[first] === nums[first - 1]) continue;
    let third = length - 1;
    const target = -nums[first];
    for (let second = first + 1; second < length; ++second) {
      if (second > first + 1 && nums[second] === nums[second - 1]) continue;
      while (second < third && nums[second] + nums[third] > target) --third;
      if (second === third) break;
      if (nums[second] + nums[third] === target)
        res.push([nums[first], nums[second], nums[third]]);
    }
  }
  return res;
}

主要比较有意思的一个点是对数组的排序,不能像很多语言里一样直接sort,因为ts / js的无参数的sort是基于字符串的,会按照UTF-16的码点来排序。所以,如果直接sort,会变成类似于这样的形式:

[-2, -4, 0, 1]

-2会出现在-4的前面,但这明显是不合理的。所以需要手动指定一个排序函数:

nums.sort((a, b) => a - b);
最后更新于: 6/25/2020, 2:10:06 PM