力扣-1.两数之和

3 阅读2分钟

屏幕截图 2026-03-16 192629.png

这题正常暴力两个for循环就解决了,但是想到时间复杂度为n方,这里采用哈希表用空间换时间。

var twoSum = function(nums, target) {
const map = new Map();  
    for(let j = 0 ; ; j++) {
        const ans = nums[j];
        if(map.has(target - ans)) {
            return [map.get(target- ans),j];
        }
        map.set(ans,j);
    }
    return [];
};
首先创建一个哈希表,再枚举j,这里枚举j不枚举i的原因是:
当我枚举i的时候,一边走一边记录,一边会检查那个数会不会在右边,这个时候没走过的地方会提前遍历一下。
当我枚举j的时候,一边走一边记录,一边检查那个数会不会在左边已走过的地方,无需多遍历。
然后当我找到那个数使得target-ans在哈希表内出现过时,就把这两个数的下标返回,
若没找到,就把nunm[j]和j存入哈希表。

(思路学自灵神)

题解用到了Map,Map是Es6引入的哈希表,用来解决Object作为哈希表的缺陷,他的本质是一个有序键值对集合,并且遍历顺序与键值对添加顺序一致(这一点与Object不同) 常见的一个缺陷场景就是:

const obj = {}; 
const key1 = { id: 1 };
const key2 = { id: 2 };
obj[key1] = "a";
obj[key2] = "b";

这个时候key1和key2会被转成同一[object Object]字符串,覆盖出错了。

const map = new Map();
const key1 = { id: 1 };
const key2 = { id: 2 };
map.set(key1, "a");
map.set(key2, "b");
console.log(map.get(key1));

此时Map就不会有这种烦恼。

核心操作(增 / 删 / 改 / 查)

const map = new Map();
// 增/改 
map.set("age", 18);
map.set("age", 20); // 键"age"已存在,覆盖值为20 
// 查 
console.log(map.get("age")); // 20 
console.log(map.get("gender")); // undefined(键不存在) 
// 判存在 
console.log(map.has("age")); // true 
// 删 
map.delete("age");
console.log(map.has("age")); // false 
// 清空&长度
map.set("name", "李四"); 
console.log(map.size); // 1 
map.clear();
console.log(map.size); // 0

如何遍历Map

const map = new Map([ 
["a", 1], 
["b", 2],
["c", 3] 
]); 
// 方式1:遍历键值对(最常用) 
for (const [key, value] of map) { 
console.log(key, value); // a 1 → b 2 → c 3 
}
// 方式2:遍历键 
for (const key of map.keys()) { 
console.log(key); // a → b → c } 
// 方式3:遍历值 
for (const value of map.values()) { 
console.log(value); // 1 → 2 → 3 } 
// 方式4:forEach 遍历 
map.forEach((value, key) => { 
console.log(key, value); // a 1 → b 2 → c 3
});