LeetCode刷题指南
第 0 章 hot100
0.1 哈希
0.2 双指针
0.3 滑动窗口
0.4 子串
0.5 普通数组
0.6 矩阵
0.7 链表
0.8 二叉树
0.9 图论
0.10 回溯
0.11 二分查找
0.12 栈
0.13 堆
0.14 贪心算法
0.15 动态规划
0.16 多维动态规划
0.17 技巧
第0-1章 面试经典150
0.1 数组/字符串
0.2 双指针
0.3 滑动窗口
链表
二叉树
第 1 章 最易懂的贪心算法
1.1 算法解释
1.2 分配问题
1.3 区间问题
1.4 练习
第 2 章 玩转双指针
2.1 算法解释
2.2 Two Sum
2.3 归并两个有序数组
2.4 滑动窗口
2.5 快慢指针
2.6 练习
第 3 章 居合斩!二分查找
3.1 算法解释
3.2 求开方
3.3 查找区间
3.4 查找峰值
3.5 旋转数组查找数字
3.6 练习
第 4 章 千奇百怪的排序算法
4.1 常用排序算法
4.2 快速选择
4.3 桶排序
4.4 练习
第 5 章 一切皆可搜索
5.1 算法解释
5.2 深度优先搜索
5.3 回溯法
5.4 广度优先搜索
5.5 练习
第 6 章 深入浅出动态规划
6.1 算法解释
6.2 基本动态规划:一维
6.3 基本动态规划:二维
6.4 分割类型题
6.5 子序列问题
6.6 背包问题
6.7 字符串编辑
6.8 股票交易
6.9 练习
第 7 章 化繁为简的分治法
7.1 算法解释
7.2 表达式问题
7.3 练习
第 8 章 巧解数学问题
8.1 引言
8.2 公倍数与公因数
8.3 质数
8.4 数字处理
8.5 随机与取样
8.6 练习
第 9 章 神奇的位运算
9.1 常用技巧
9.2 位运算基础问题
9.3 二进制特性
9.4 练习
第 10 章 妙用数据结构
10.1 C++ STL
10.2 Python 常用数据结构
10.3 数组
10.4 栈和队列
10.5 单调栈
10.6 优先队列
10.7 双端队列
10.8 哈希表
10.9 多重集合和映射
10.10 前缀和与积分图
10.11 练习
第 11 章 令人头大的字符串
11.1 引言
11.2 字符串比较
11.3 字符串理解
11.4 字符串匹配
11.5 练习
第 12 章 指针三剑客之一:链表
12.1 数据结构介绍
12.2 链表的基本操作
12.3 其它链表技巧
12.4 练习
第 13 章 指针三剑客之二:树
13.1 数据结构介绍
13.2 树的递归
13.3 层次遍历
13.4 前中后序遍历
13.5 二叉查找树
13.6 字典树
13.7 练习
第 14 章 指针三剑客之三:图
14.1 数据结构介绍
14.2 二分图
14.3 拓扑排序
14.4 练习
第 15 章 更加复杂的数据结构
15.1 引言
15.2 并查集
15.3 复合数据结构
15.4 练习
第16章 面试题
第 17 章 十大经典排序算法
README
本文档使用 MrDoc 发布
-
+
首页
10.8 哈希表
# 10.8 哈希表 `哈希表(hash table, hash map)`,又称散列表,使用 $O(n)$ 空间复杂度存储数据,通过哈希函数(hash function)映射位置,从而实现近似 $O(1)$ 时间复杂度的插入、查找、删除等操作。哈希表可以用来统计频率,记录内容等等。 如果元素有穷,并且范围不大,那么可以用一个固定大小的数组来存储或统计元素。例如我们需要统计一个字符串中所有字母的出现次数,则可以用一个长度为 26 的数组来进行统计,其哈希函数即为字母在字母表的位置,这样空间复杂度就可以降低为常数。 ## [1. Two Sum](https://leetcode.com/problems/two-sum/) ### 题目描述 给定一个(未排序的)整数数组,已知有且只有两个数的和等于给定值,求这两个数的位置。 ### 输入输出样例 输入一个一维整数数组和一个目标值,输出是一个大小为 2 的一维数组,表示满足条件的两个数字的位置。 ``` Input: nums = [2, 7, 15, 11], target = 9 Output: [0, 1] ``` 在这个样例中,第 0 个位置的值 2 和第 1 个位置的值 7 的和为 9。 ### 题解 我们可以利用哈希表存储遍历过的值以及它们的位置,每次遍历到位置 i 的时候,查找哈希表里是否存在 target - nums[i],若存在,则说明这两个值的和为 target。 ```py def twoSum(nums: List[int], target: int) -> List[int]: cache = dict() # <值,位置> for i, num1 in enumerate(nums): num2 = target - num1 if num2 in cache: return [cache[num2], i] cache[num1] = i return [] ``` ## [128. Longest Consecutive Sequence](https://leetcode.com/problems/longest-consecutive-sequence/) ### 题目描述 给定一个整数数组,求这个数组中的数字可以组成的最长连续序列有多长。 ### 输入输出样例 输入一个整数数组,输出一个整数,表示连续序列的长度。 ``` Input: [100, 4, 200, 1, 3, 2] Output: 4 ``` 在这个样例中,最长连续序列是 [1,2,3,4]。 ### 题解 我们可以把所有数字放到一个哈希表,然后不断地从哈希表中任意取一个值,并删除掉其之前之后的所有连续数字,然后更新目前的最长连续序列长度。重复这一过程,我们就可以找到所有的连续数字序列。 ```py def longestConsecutive(nums: List[int]) -> int: cache = set(nums) max_len = 0 while len(cache) > 0: cur = next(iter(cache)) cache.remove(cur) l, r = cur - 1, cur + 1 while l in cache: cache.remove(l) l -= 1 while r in cache: cache.remove(r) r += 1 max_len = max(max_len, r - l - 1) return max_len ``` ## [149. Max Points on a Line](https://leetcode.com/problems/max-points-on-a-line/) ### 题目描述 给定一些二维坐标中的点,求同一条线上最多有多少点。 ### 输入输出样例 输入是一个二维整数数组,表示每个点的横纵坐标;输出是一个整数,表示满足条件的最多点数。 ``` Input: [[1,1],[3,2],[5,3],[4,1],[2,3],[1,4]] ^ | | o | o o | o | o o +-------------------> 0 1 2 3 4 5 6 Output: 4 ``` 这个样例中,$y =5 − x$ 上有四个点。 ### 题解 对于每个点,我们对其它点建立哈希表,统计同一斜率的点一共有多少个。这里利用的原理是,一条线可以由一个点和斜率而唯一确定。另外也要考虑斜率不存在和重复坐标的情况。 本题也利用了一个小技巧:在遍历每个点时,对于数组中位置 i 的点,我们只需要考虑 i 之后的点即可,因为 i 之前的点已经考虑过 i 了。 ```py def maxPoints(points: List[List[int]]) -> int: max_count, n = 0, len(points) for i, point1 in enumerate(points): cache = dict() # <斜率, 点个数> same_xy, same_y = 1, 1 for point2 in points[i + 1:]: if point1[1] == point2[1]: same_y += 1 if point1[0] == point2[0]: same_xy += 1 else: dx, dy = point1[0] - point2[0], point1[1] - point2[1] cache[dx / dy] = cache.get(dx / dy, 0) + 1 max_count = max(max_count, same_y) for count in cache.values(): max_count = max(max_count, same_xy + count) return max_count ```
嘉心糖糖
2025年3月11日 19:37
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码