返回
算法入门必备——Set 和 Map 数据结构讲解(附 LeetCode 题目解析)
前端
2024-01-30 15:14:15
前言
在计算机科学中,数据结构是组织和存储数据的方式。选择合适的数据结构可以大大提高算法的效率。Set 和 Map 都是常用的数据结构,在许多编程语言中都有实现。本文将详细介绍 Set 和 Map 的基本概念、常见操作、时间复杂度分析以及 LeetCode 题目的详细解析,帮助读者深入理解这些数据结构的应用和实现。
Set
Set 是一种无序集合,它允许存储任何类型的唯一值,无论是原始值或者是对象引用。Set 中的元素是无序的,这意味着它们没有特定的顺序。Set 最常用的操作包括:
- 添加元素:向 Set 中添加一个新的元素。
- 删除元素:从 Set 中删除一个元素。
- 检查元素是否存在:检查一个元素是否在 Set 中。
- 获取 Set 的大小:返回 Set 中元素的数量。
Set 的时间复杂度分析如下:
- 添加元素:O(1)
- 删除元素:O(1)
- 检查元素是否存在:O(1)
- 获取 Set 的大小:O(1)
Map
Map 是一种键值对集合,它允许存储任何类型的键和值。Map 中的键是唯一的,而值可以是任何类型。Map 最常用的操作包括:
- 设置值:将一个值与一个键相关联。
- 获取值:根据键获取与之相关联的值。
- 删除值:根据键删除与之相关联的值。
- 检查键是否存在:检查一个键是否在 Map 中。
- 获取 Map 的大小:返回 Map 中键值对的数量。
Map 的时间复杂度分析如下:
- 设置值:O(1)
- 获取值:O(1)
- 删除值:O(1)
- 检查键是否存在:O(1)
- 获取 Map 的大小:O(1)
LeetCode 题目解析
接下来,我们将通过 LeetCode 题目的解析,来进一步理解 Set 和 Map 的应用和实现。
1. 两个数组的交集
给定两个数组,找出它们的交集。
def intersection(nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: List[int]
"""
# 将 nums1 转换为集合
set1 = set(nums1)
# 将 nums2 转换为集合
set2 = set(nums2)
# 求两个集合的交集
intersection = set1 & set2
# 将交集转换为列表并返回
return list(intersection)
2. 无重复字符的最长子串
给定一个字符串,找出其中不包含重复字符的最长子串的长度。
def length_of_longest_substring(s):
"""
:type s: str
:rtype: int
"""
# 创建一个集合来存储子串中的字符
char_set = set()
# 创建两个指针,分别指向子串的开头和结尾
left, right = 0, 0
# 创建一个变量来存储最长子串的长度
max_length = 0
# 循环遍历字符串
while right < len(s):
# 如果当前字符不在集合中,则将其添加到集合中并更新子串的长度
if s[right] not in char_set:
char_set.add(s[right])
max_length = max(max_length, right - left + 1)
right += 1
# 如果当前字符在集合中,则将左指针向右移动一位,并从集合中删除左指针指向的字符
else:
char_set.remove(s[left])
left += 1
# 返回最长子串的长度
return max_length
总结
Set 和 Map 是两种常见的数据结构,在许多编程语言中都有实现。它们具有不同的特点和应用场景。Set 是一种无序集合,它允许存储任何类型的唯一值。Map 是一种键值对集合,它允许存储任何类型的键和值。通过 LeetCode 题目的解析,我们可以进一步理解 Set 和 Map 的应用和实现。