【leetcode】三数之和

71 阅读1分钟

题目描述:

给你一个包含 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]
输出: []

代码实现

    //排序+双指针
    threeSum(nums){
        const ret = []
        if(nums == null || nums.length < 3) return ret
        nums.sort((a, b) => a-b)
        const len = nums.length
        for(let i = 0; i < len; i++){
            if(nums[i] > 0) break;  //当前项大于0的话直接结束循环,因为数组是有序的
            if(i > 0 && nums[i] === nums[i-1]) continue //去重
            let l = i+1, r=len-1;
            while(l < r) {
                let sum = nums[i] + nums[l] + nums[r]
                if(sum === 0) {
                    ret.push([nums[i], nums[l], nums[r]])
                    while(l < r && nums[l] === nums[l+1]) l++  //去重
                    while(l < r && nums[r] === nums[r-1]) r--  //去重
                    l++
                    r--
                } else if(sum < 0) {
                    l++
                } else {
                    r--
                }
            }
        }
        return ret
    }