返回

力扣刷题 | 重复 N 次的元素:Set 优化 + 连续子序列分析

前端

前言:理解问题的核心

LeetCode 961 题要求我们找到一个数组中重复了 N 次的元素。N 是数组长度的 1/3,换句话说,数组中存在一个元素出现了超过 1/3 的次数。乍一看,这个问题似乎很棘手,但如果你细心分析,就会发现一个关键点:由于 N 是数组长度的 1/3,因此数组中最多只能有三个不同的元素。

基于这一观察,我们可以制定一个巧妙的策略:

  1. 初始化一个集合 Set,它可以存储数组中的唯一元素。
  2. 遍历数组,对于每个元素,检查它是否已经在 Set 中。
  3. 如果元素在 Set 中,则递增其出现次数;否则,将其添加到 Set 中。
  4. 一旦 Set 中的元素数量超过 1,则可以推断出存在重复元素。

算法剖析:Set 优化与连续子序列分析的融合

现在,让我们深入了解算法的细节:

  1. Set 优化: 我们使用 Set 来存储数组中的唯一元素。Set 是一个集合数据结构,它可以快速确定元素是否已经存在,从而避免了重复插入的开销。
  2. 连续子序列分析: 当 Set 中的元素数量超过 1 时,我们知道数组中存在重复元素。接下来,我们需要确定重复的元素及其出现次数。为了做到这一点,我们分析数组中的连续子序列。如果子序列中所有元素都相同,则该元素就是重复的元素。

代码实现:简洁高效的解决方案

以下是用 Python 实现的代码:

def repeated_n_times(nums):
    """
    :type nums: List[int]
    :rtype: int
    """
    unique_nums = set()  # 初始化一个集合来存储唯一元素
    for num in nums:
        if num not in unique_nums:
            unique_nums.add(num)  # 如果元素不存在,则将其添加到集合中
        else:
            return num  # 如果元素存在,则返回它

复杂度分析:时间和空间效率的权衡

算法的时间复杂度为 O(n),其中 n 是数组的长度。这是因为我们遍历了数组一次,并在 Set 中查找每个元素。算法的空间复杂度也是 O(n),因为 Set 最多可以存储 n 个唯一元素。

总结:独辟蹊径的解题思路

总而言之,解决 LeetCode 961 题的关键在于巧妙地融合 Set 优化和连续子序列分析。通过使用 Set 来存储唯一元素并分析连续子序列,我们可以高效地识别重复的元素。这种独辟蹊径的解题思路不仅展示了算法设计的优雅,也突出了数据结构在解决实际问题中的重要性。