【javascript 算法:三数之和】力扣15题

189 阅读2分钟

本文我们主要讲述的是力扣第15题三数之和。

本题十分经典,涵盖了算法题目中需要注意的一些要点,看完代码解析之后我们来总结一下。

var threeSum = function(nums) {

  let res = []
  //老规矩,将数组进行排序后,我们在操作指针时的逻辑将会清晰很多。
  nums = nums.sort((a,b)=>{
    return a-b
  })
  
  //这里为什么要把i的结束位置设置在length-2呢,因为后面还有start和end指针,两者不能指向同一,故最后要留两个位置。
  for(let i=0;i<nums.length-2;i++){
    //防止i的指针指向的数字相同,我们做出如下的条件再进入判断之中。
    if(i===0 || nums[i]!==nums[i-1]){
      //既然是3数之和,那么就需要三个指针。
      let start = i+1
      let end = nums.length-1
      while(start<end){
        if(nums[i]+nums[start]+nums[end] === 0){
          res.push([nums[i],nums[start],nums[end]])
          //在得到符合条件的元素后,要继续让start和end移动
          start++
          end--
          //然后要继续做去重操作,防止得到连续两个相同且符合条件的结果。
          while(nums[start]===nums[start-1]){
            start++
          }
          while(nums[end] === nums[end+1]){
            end--
          }
        }
        //如果是结果不符合的,则不需要防止指针前后两数一样,故不作去重操作。
        else if(nums[i]+nums[start]+nums[end] < 0){
          start++
        }
        else{
          end--
        }
      }
    }
  }
  return res
};

总结:

1.常见的指针解法,本题是3数之和,很容易想到,需要三个指针。

2.在本题中,i指针的尽头必须在nums.lemgth-2之前,因为避免与start和end指针发生重合,产生重复的结果。

3.本题最主要的考点也在于三个指针的一个防止重复的处理方法,如果指针与所指前一位相等,则需要继续指向下一位,而这样的去重操作需要在得到符合条件的结果之后指针移动的行为发生后进行。可有效防止得到一个一样的符合条件的结果。