前端算法·专项攻破五:哈希

278 阅读2分钟

概念理解

什么是哈希(表)?

散列表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的下标为24的下标为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

相关文章

您的点赞和评论是我持续更新的动力,感谢关注。