概念理解
什么是哈希(表)?
散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存储存位置的数据结构。也就是说,它通过计算出一个键值的函数,将所需查询的数据映射到表中一个位置来让人访问,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表。 -- 维基百科
在 ES6 中,提供的 Map 对象,用来表示哈希数据结构。
问:JS 如何实现一个 Map 数据结构?可参考 JavaScript实现哈希表
问:Map 和 普通对象的区别?可参考 Object与Map的异同及使用场景
使用场景
需要记录多个状态的场景。
例题讲解
题目:两数之和
描述
给出一个整型数组 numbers 和一个目标值 target,请在数组中找出两个加起来等于目标值的数的下标,返回的下标按升序排列。 (注:返回的数组下标从1开始算起,保证target一定可以由数组里面2个数字相加得到)
要求:空间复杂度 O(n),时间复杂度 O(nlogn)
示例1
输入:
[3,2,4],6
返回值:
[2,3]
说明:
因为 2+4=6 ,而 2的下标为2 , 4的下标为3 ,又因为 下标2 < 下标3 ,所以返回[2,3]
示例2
输入:
[20,70,110,150],90
返回值:
[1,2]
说明:
20+70=90
题解:
/**
* 解法:哈希
* 思路:遍历的同时借助哈希表,记录值和下标
* 时间复杂度:O(n),最多遍历数组一遍,每次查询哈希表都是O(1)
* 空间复杂度:O(n),最坏情况下找到数组结尾才找到,其他都加入哈希表,哈希表最长 n - 1
*/
export function twoSum(numbers: number[], target: number): number[] {
const res: number[] = []
const len = numbers.length
if (len === 0) return res
const map = new Map()
for (let i = 0; i < len; i++) {
const temp = target - numbers[i]
if (!map.has(temp)) {
map.set(numbers[i], i)
} else {
res.push(map.get(temp) + 1)
res.push(i + 1)
return res
}
}
return res
};
题集&题解
序号 | 题目 | 题解 | 难度 |
---|---|---|---|
1 | 两数之和 | 题解 | easy |
2 | 数组中出现次数超过一半的数字 | 题解 | easy |
3 | 数组中只出现一次的两个数字 | 题解 | medium |
4 | 缺失的第一个正整数 | 题解 | medium |
5 | 三数之和 | 题解 | medium |
相关文章
- 前端算法入门一:刷算法题常用的JS基础扫盲
- 前端算法入门二:时间空间复杂度&8大数据结构的JS实现
- 前端算法入门三:5大排序算法&2大搜索&4大算法思想
- 前端面试算法高频100题(附答案,分析思路,一题多解)
您的点赞和评论是我持续更新的动力,感谢关注。