Leetcode:15.三数之和

175 阅读1分钟

力扣题目链接

题意:

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

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

image.png

思路:

  • 要求三个数的和是否为0,则可以对数组进行遍历,同时定义两个指针,不断进行移动。当三个数和为0时,则记录下这个值。
  • 题目要求不能重复,则可以一开始对数组进行排序,再之后遍历i和移动指针start和end时,跳过与前面数值相等的数,因为是排序好的,所以相等的数会排在一起。且这样更好计算没有重复的三数的和
/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var threeSum = function(nums) {
    //数组排序
    nums.sort(function(a,b){
        return a-b
    })
    let result = []
    //从数组开始遍历到length-2,遍历时要注意当前的数是否与前一个数相等
    for(let i=0;i<nums.length-2;i++){
        //定义两个指针,start=i+1,end=length-1,分别将两个指针放到当前遍历数的开始和末尾
        //若相等,则跳过(去重)
        //若不相等,则进行下一步操作
        if(i===0 || nums[i]!==nums[i-1]){
        let start = i+1
        let end = nums.length-1
            while(start<end){
                 //计算nums[i]+nums[start]+nums[end]的和:
                 //若===0,则说明找到了,返回结果
                if((nums[i]+nums[start]+nums[end])===0){
                    result.push([nums[i],nums[start],nums[end]])
                    start++
                    end--                   
                    //start,end移动时也要注意比较是否与前一个数值相同,以便去除重复
                    while(start<end && nums[start]===nums[start-1] ){
                        start++
                    }                   
                    while(start<end && nums[end]===nums[end+1]){
                        end--
                    }
                //若<0,start++,使得这个数组的和能变大
                }else if((nums[i]+nums[start]+nums[end])<0){
                    start++
                //若>0,end--,使得这个数组的和缩小
                }else{
                    end--
                }
            }
        }
    }
    return result
            
};