打怪升级之旅第三天(1)

77 阅读2分钟

每天进步一点点

算法开始第三天 三数求和 难度 medium 对撞指针比hash表 简单很多

两数相加

题目描述

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

hash表解法

求和问题 都可以 求差问题

思路分析

/**
 *
 * @param {number[]} nums
 * 时间复杂度 O(n^ 2)
 * 空间复杂度 O(n)
 */
const threeSum = function (nums) {
  let result = []
  let len = nums.length;
  nums = nums.sort((a, b) => a - b);
  for (let i = 0; i < len; i++) {
    let x = nums[i]
    if(i > 0 && nums[i] == nums[i -1]) continue
    if (x + nums[i + 1] + nums[i + 2] > 0) break;
    let map = new Map()
    for(let j = i+ 1; j < len; j++){
      if(j > i+ 2 && nums[j] === nums[j -1] && nums[j -1] == nums[j -2]) continue
      let c = 0 - nums[i] - nums[j]
      if(map.has(c)){
        result.push([nums[i], nums[j],c])
        map.delete(c)
      }else{
        map.set(nums[j],'')
      }
    }
  }
  return result
};

console.time("threeSum");
const result1 = threeSum([-1, 0, 1, 2, -1, -4]);
console.timeEnd("threeSum"); // 0.092
console.log(">>>><<<", result1); //  [ [ -1, 1, 0 ], [ -1, 2, -1 ] ]

双指针

思路分析

/**
 * 
 * @param {number[]} nums 
 * 时间复杂度 O(n^ 2)
 * 空间复杂度 O(1)
 */
function threeSum(nums) {
  let res = [] // 最坏执行次数: 1
  nums = nums.sort((a, b) => {
    return a - b
  })// 最坏执行次数: logn
  let len = nums.length // // 最坏执行次数: 1
  for (let i = 0; i < len - 2; i++) { // 最坏执行次数: n - 2
    let x = nums[i]  //  最坏执行次数: n - 2
    if (i > 0 && x === nums[i - 1]) continue //  最坏执行次数: n - 2
    if (x + nums[i + 1] + nums[i + 2] > 0) break //  最坏执行次数: n - 2
    if (x + nums[len -1] + nums[len - 2] < 0) continue //  最坏执行次数: n - 2
    let l = i + 1 //  最坏执行次数: n - 2
    let r = len - 1 //  最坏执行次数: n - 2
    while (l < r) { //  最坏执行次数: n^2 - 2n
      if (x + nums[l] + nums[r] < 0) { 
        l++ 
      } else if (x + nums[l] + nums[r] > 0) {  
        r-- 
      } else {
        res.push([x, nums[l], nums[r]])
        l++
        while (l < r && nums[l] === nums[l - 1]) {
          l++
        }
        r--
        while (l < r && nums[r] === nums[r + 1]) {
          r--
        }
      }
    }
  }
  return res
}

console.time('threeSum')
const result = threeSum([-1, 0, 1, 2, -1, -4])
console.timeEnd('threeSum') // 0.141
console.log('>>>><<<', result) //  [ [ -1, -1, 2 ], [ -1, 0, 1 ] ]

Baybay!!