leetcode 第15题三数之和

230 阅读1分钟

题目: 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。

注意: 答案中不可以包含重复的三元组。

[leetcode题目链接](leetcode.cn/problems/3s…

我的JavaScript解法

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var threeSum = function(nums) {
  const result = []
  const length = nums.length
  if (nums == null || length < 3)
    return result
  nums.sort((a, b) => a -b) // 排序
  for (let i = 0; i < length-2; i++) {
    if (nums[i] >0) break; // 最小的数大于零,剔除
    if (i > 0 && nums[i] == nums[i-1])
      continue; // 第一个数和上一次循环的一个数相等,去重
    let left = i + 1, right = length - 1;
    while (left < right) {
      const sum = nums[i] + nums[left] + nums[right]
      if (sum == 0) {
        result.push([nums[i], nums[left], nums[right]])
        while(nums[left] == nums[left+1]) left++; // 第二个数去重
        while(nums[right] == nums[right-1]) right--; // 第三个数去重
        left++;
        right--;
      } else if (sum < 0) {
        left ++
      } else if (sum > 0) {
        right--
      }
    }
  }
  return result;
};

解析: 排序+双指针 参考画手大鹏的解析

  • 时间复杂度: 排序时间O(nlgn)O(nlgn) + for调用whileO(n2)O(n^2) = O(n2)O(n^2)
  • 空间复杂度:O(1)O(1)