力扣100题---哈希
1.两数之和
描述:给定一个整数数组
nums
和一个整数目标值target
,请你在该数组中找出 和为目标值target
的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案
思路一:
- 暴力模拟,两个变量从前往后遍历,避免重复和自己和自己配对
- 代码:
1 |
|
思路二:
- 使用HASH表记录之前出现过的数字以及它的下标,那么只需要遍历数组一次,即O(N)的复杂度就可以找到对应的答案了
- 代码
1 |
|
2.字母异位词分组
描述:给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
思路一:
- 将每个单词的排序后的词作为哈希表的key,依次加入到对应的哈希值里,哈希表的value采取default的list,最终以list的形式返回哈希表的所有值
- 代码:
1 |
|
思路二:
- 把每个单词里26个字母按顺序出现的次数作为哈希表的key
- 代码:
1 |
|
3.最长连续序列
描述:给定一个未排序的整数数组
nums
,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为
O(n)
的算法解决此问题。
思路一:
- 先对nums去重,存储在set里,本身就是个哈希表,查找速度为O(1)。为了避免重复遍历连续数组,在遍历前先判断当前数字num的num-1是否存在,使得每次遍历都是从连续数据的第一个数开始的。最终整体的时间复杂度为O(N)
- 代码:
1 |
|
思路二:
- 利用并查集,把连续数字作为并查集的定义,不断进行合并,那么最终长度最大的并查集就是最长的连续数组。时间复杂度可以看作是O(N)。
- 代码:
1 |
|
小节:
- 哈希表的主要作用是降低查找的时间复杂度,从而降低整体的时间复杂度
- 哈希表的初始化
- dict()
- collections.defaultdict()—需要默认值
- set()—初始化为set数据结构,去重的同时查找速度也很快
- 哈希表的键必须是不可变的,包括整数(int)、浮点数(float)、字符串(str)、元组(tuple)。列表(list)是可变的对象,需要转化为tuple再作为哈希表的键
力扣100题---哈希
http://example.com/2024/08/03/力扣100题/力扣100题-哈希/