我的js算法爬坑之旅-三数之和

149 阅读1分钟

第二十天:力扣第15题,三数之和

地址:leetcode-cn.com/problems/3s…

思路:一开始常规暴力解题,一如既往的超时,后来想一想,看看解析,还是用排序加双指针吧:

先将数组进行排序从左侧开始,选定一个值为定值 ,右侧进行求解,获取与其相加为0的两个值,类似于快排,定义首和尾,首尾与定值相加等于0记录这三个值。小于0,首部右移;大于 0,尾部左移。最后定值右移,重复该步骤。

var threeSum = function(nums) {
  nums.sort((a,b) => a - b);//排序
  let i = 0;
  let res = [];
  if(nums[0] <= 0 && nums[nums.length - 1] >= 0)//筛选
  {
    while(i < nums.length - 2)//条件
  {
    let left = i + 1;
    let right = nums.length - 1;
    while(left < right)
    {
      if(nums[right] < 0)//筛选
      {
        break;
      }
      if(nums[i] + nums[left] + nums[right] === 0)
      {
        res.push([nums[i],nums[left],nums[right]]);//填充
        while (nums[left] === nums[++left]) {}
      }
      else if(nums[i] + nums[left] + nums[right] < 0)
      {
        while (nums[left] === nums[++left]) {}//防止重合
      }
      else{
        while (nums[right] === nums[--right]) {}//防止重合
      }
    }
    while (nums[i] === nums[++i]) {}//防止重合
  }
  }
  return res;
};
执行用时:180 ms, 在所有 JavaScript 提交中击败了46.17%的用户
内存消耗:47.8 MB, 在所有 JavaScript 提交中击败了30.60%的用户