哈希表优化查找
题目:
一开始用的暴力求解方式:(直接两个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]
}
}
}
};
哈希表思维:(无论查什么东西,都在指定的这个表中去查。查到输出,查不到的将其加入表中)
- 建立哈希表: 首先需要确定所查找的东西是什么和返回的东西是什么,在这里就是当前的值和索引。那么存哈希表的时候 -> 表[查找的东西]=返回的东西 【个人理解:数组直接通过索引寻址很快,那么将要查的东西直接放在索引上,就很快就能查到。】
- 遍历数组,依次去查哈希表,查不到就入表。
解决代码:
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; // 存入当前的元素和对应的索引
}
}
}