使用哈希表优化查找算法【Javascript】--- 学习笔记1

24 阅读1分钟

哈希表优化查找

题目:

image.png

一开始用的暴力求解方式:(直接两个for循环搞定)

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(nums, target) {
    let i = nums.length
    for (var a = 0;a < i;a++){
        for (var b = a+1;b < i; b++){
            if((nums[a]+nums[b] == target) &&(a!=b)){
                console.log(`[${a},${b}]`)
                return [a,b]
            }
        }
    }
};

哈希表思维:(无论查什么东西,都在指定的这个表中去查。查到输出,查不到的将其加入表中)

  1. 建立哈希表: 首先需要确定所查找的东西是什么和返回的东西是什么,在这里就是当前的值和索引。那么存哈希表的时候 -> 表[查找的东西]=返回的东西 【个人理解:数组直接通过索引寻址很快,那么将要查的东西直接放在索引上,就很快就能查到。】
  2. 遍历数组,依次去查哈希表,查不到就入表。

image.png

解决代码:

const twoSum = (nums, target) => {
  const prevNums = {};                    // 存储出现过的数字,和对应的索引               

  for (let i = 0; i < nums.length; i++) {       // 遍历元素   
    const curNum = nums[i];                     // 当前元素   
    const targetNum = target - curNum;          // 满足要求条件  
    const targetNumIndex = prevNums[targetNum]; // 查哈希表 获取目标元素的索引
    if (targetNumIndex !== undefined) {         // 如果存在,直接返回 [目标元素的索引,当前索引]
      return [targetNumIndex, i];
    } else {                                    // 如果不存在,说明之前没出现过目标元素
      prevNums[curNum] = i;                     // 存入当前的元素和对应的索引
    }
  }
}