Skip to content

1、两数之和

1、两数之和

js
;(function () {
  /**
   * 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。
   * 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
   * 你可以按任意顺序返回答案。
   * @param {number[]} nums
   * @param {number} target
   * @return {number[]}
   */

  // interface ArrayKeyAny {
  //     [key: string | number | symbol]: any
  // }

  type numberArray = number[][]

  // ## 返回所有满足条件的
  var twoSum = function (nums: number[], target: number): numberArray {
    // res是二维数组,保存符合要求的数组下标值
    let res: numberArray = []
    nums.forEach((x, k) => {
      for (let i = 1; i < nums.length; i++) {
        // i > k:去掉重复相加的两个元素
        target === x + nums[i] && i > k ? res.push([k, i]) : null
      }
    })
    return res
  }
  console.log(twoSum([1, 2, 3, 4, 5, 8, 7], 6)) // [ [ 0, 4 ], [ 1, 3 ] ]

  // ## 只返回第一个满足条件的两个元素
  function twoSumOnlyOne(nums: number[], target: number): number[] {
    // 方法一
    // let res: number[] = [];
    // nums.forEach((x, k) => {
    //     for (let i = 1; i < nums.length; i++) {
    //         // i > k:去掉重复相加的两个元素
    //         (target === x + nums[i] && i > k) ? res.push(k, i) : null;
    //     }
    // })
    // return res

    // 方法二
    // let res: number[] = [];
    // for (let i = 0; i < nums.length; i++) {
    //     let index = nums.indexOf(target - nums[i]);
    //     if(index !== -1 && i !== index) {
    //         res.push(i, index)
    //         break;
    //     }
    // }
    // return res

    // 方法三
    let res: number[] = []
    const set = new Set()
    for (let i = 0; i < nums.length; i++) {
      // diff:差值
      let diff = target - nums[i]
      if (set.has(diff)) {
        res.push(nums.indexOf(diff), i)
        break
      }
      set.add(nums[i])
    }
    return res
  }
  console.log(twoSumOnlyOne([1, 2, 3, 4, 5, 8, 7], 6)) // [ 1, 3 ]
  console.log(twoSumOnlyOne([3, 2, 4, 2, 2, 3], 6)) // [ 1, 2 ]
})()