两数之和、三数之和

82 阅读1分钟

题目

给定一个数组,返回其中一组两个元素的和为指定数字的集合

  • 通过对象存另一个元素的值,实现遍历一次即可
function towSum(arr, target) {
  const temp = {};
  for (let i = 0; i < arr.length; i++) {
    let other = target - arr[i];
    if (temp[other]) {
      return [arr[i], other];
    }
    temp[other] = true;
  }
}

//immutable 版本
function towSum(arr, target) {
  const dict = Object.fromEntries(arr.map(i=>[i,true]));
  return arr.some(i => dict[target - i])
}

//更精简版本
function towSum(arr, target) {
  return arr.some(i => arr.includes[target - i])
}

//递归版本
function twoSum(arr,target,set){
    if(!arr.length){
        return false;
    }
    const next=arr[0]-target;
    return  set.contains(next)||twoSum(arr.slice(1),target,new Set([...set,arr[0]]))
}


给定一个数组,返回三个和为0的一组元素

  • 通过一个开关,实现双指针左右遍历的方式
function threeSum(nums) {
  let start = 0;
  let end = nums.length - 1;
  let reverse = true;

  while (start < end) {
    for (let k = start + 1; k < end; k++) {
      if (nums[start] + nums[end] + nums[k] === 0) {
        return [start, k, end];
      }
    }
    if (reverse) {
      start += 1;
    } else {
      end -= 1;
    }
    reverse = !reverse;
  }
}