哈希解_两数之和

119 阅读1分钟

今天又是苦逼搬砖的一天

正题

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

image.png

方法一:数组枚举,暴力破解法。

原理: 讲述组遍历,依次两两相加,得到 target ,求出 下标


/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function (nums, target) {
  for (let index = 0; index < nums.length - 1; index++) {
    for (let subIndex = index + 1; subIndex < nums.length; subIndex++) {
      let x = nums[index]
      let y = nums[subIndex]
      if (target === x + y) {
        return [index, subIndex]
      }
    }
  }
};

方法二:哈希表法:

枚举法找到 target - x 的时间复杂度较高,因此优化的方法应当从降低时间复杂度来看。使用哈希表,可以将寻找 target - x 的时间复杂度从 O(N) 降低到 O(1),最多只需要将数组遍历一遍即可完成计算。

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */ 
var twoSum = function (nums, target) {
  const map = {}
  for (let index = 0; index < nums.length; index++) {
    const values = Object.values(map)
    const keys = Object.keys(map)
    const number = nums[index]
    let i = values.indexOf(number)
    if (i !== -1) {
      return [parseInt(keys[i]), index]
    } else {
      map[String(index)] = target - number
    }
  }
}