返回

算法入门必备——Set 和 Map 数据结构讲解(附 LeetCode 题目解析)

前端

前言

在计算机科学中,数据结构是组织和存储数据的方式。选择合适的数据结构可以大大提高算法的效率。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 的应用和实现。