JS_LeetCode01:两数之和

img

1.两数之和

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

你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。

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

哈希表(对象)

哈希表,英文名Hash Table,也叫做散列表。

它是以键值对形式存储数据的数据结构。是数组的扩展,利用了数组根据下标访问数据的特性。

核心原理是使用哈希函数(Hash Function),将键转为数组的索引,从而快速定位置值。

JS中的对象{ }就相当于一个哈希表,不过更推荐使用Map类型处理哈希表需求:

? Object与Map的区别

Map是ES6引入的数据结构,为了高效存取键值对优化的哈希表!没有原型链污染问题。

原型链污染:通过修改对象的原型,影响到所有基于这个原型创建的对象,造成安全漏洞。

1
2
3
4
5
6
7
8
const obj = {};
console.log(obj.toString); // 正常输出 [Function: toString]

obj.__proto__.hacked = true; // bj.__proto__ 实际上是 Object.prototype;

const another = {};
console.log(another.hacked); // 输出 true!它居然也被污染了

  • 键的类型

    • Object的键只能是字符串 或者 Symbol
    • Map的键可以是任何类型
  • 键的顺序

    • Object没有明确顺序
    • Map根据插入顺序迭代
  • 性能

    • Object有原型链影响,比较慢
    • Map转为哈希映射优化,更快

解答

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
const map = {}
for (let i=0;i<nums.length;i++){
const matched = target - nums[i]
if (map.hasOwnProperty(matched)){
return [i,map[matched]]
}
map[nums[i]] = i
}
return []
};