题目

https://leetcode.cn/leetbook/read/top-interview-questions-medium/xvpj16/

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i!= ji!= k j!= k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。

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

实现

思路:排序加双指针,设定 i<j<k,当 i 固定时查询是否存在 nums[j],nums[k] 满足条件 边界:0<=i<j<k<=nums[length-1] 注意:三元组去重

复杂度分析

  • 时间复杂度:排序 + 双层循环
  • 空间复杂度:
/**
 * @param {number[]} nums
 * @return {number[][]}
 */
// 思路:双指针,设定i<j<k,当i固定时查询是否存在nums[j],nums[k]满足条件
// 边界:0<=i<j<k<=nums[length-1]
// 注意:三元组去重
var threeSum = function (nums) {
    const n = nums.length;
    const res = [];
    nums.sort((a, b) => a - b)
    for (let i = 0; i < n - 2; i++) {
        if (nums[i] > 0) break; // 因为数组已排序,i>0时三数和不可能为0
        // 去重
        if (i > 0 && nums[i] == nums[i - 1]) continue;
 
        let j = i + 1, k = n - 1;
        while (j < k) {
            let sum = nums[i] + nums[j] + nums[k]
            if (sum == 0) {
                res.push([nums[i], nums[j], nums[k]]);
                // 去重
                while (j < k && nums[j] === nums[j + 1]) j++;
                while (j < k && nums[k] === nums[k - 1]) k--;
                j++;
                k--;
            } else if (sum < 0) j++
            else k--
        }
 
    }
    return res;
 
};