返回

LeetCode 217:是否存在重复元㖊?人工智能带你一一剖析

Android

题目概览

给定一个整数数组 'arr',请你判断是否存在至少一个元㖊在该数组中重复出现了。

示例:

  • 输入:[1,2,3,4,5,1,2]
  • 输出:true

提示:

  • 数组长度在 [1, 10^5] 范围内。
  • 数组中每个整数在 [-10^9, 10^9] 范围内。

解题思路

哈希表法

哈希表是本题最直观的解法。其核心思想在于:

  • 创建一个哈希表,将数组中的每个元㖊及其对应频率映射起来。
  • 遍历数组中的每个元㖊,若其频率大于 1,则说明该元㖊重复出现了。

算法流程:

  1. 创建一个哈希表 'table',初始时所有元㖊的频率均为 0。
  2. 遍历数组 'arr' 中的每个元㖊 'x'
    • 如果 'table' 中没有 'x',则将其加入哈希表,并将其频率初始化为 1。
    • 否则,将 'table[x]' 增加 1。
  3. 遍历哈希表 'table',若找到频率大于 1 的元㖊,则说明该元㖊重复出现了,直接退出循环并 'return true'
  4. 遍历完毕,若未找到重复元㖊,则说明数组中没有重复元㖊,'return false'

时间复杂度: O(n),n 为数组长度。哈希表对每个元㖊的访问和频率的判断均为常数时间复杂度。

空​​间复杂度: O(n),哈希表中需要存储数组中所有不同的元㖊。

复杂度解析:

哈希表法的时间复杂度由哈希表的操作决定。哈希表的常数时间复杂度为 O(1),而数组长度为 n

扩展:进阶解法

位运算法

位运算是一种更为巧妙的解法。其原理在于:

  • 将数组中所有元㖊的二进制位表示分别与一个 32-bit 的整数进行按位与运算。
  • 运算后的整数将包含数组中所有元㖊出现的频率信息。
  • 利用按位与运算,我们可以判断是否存在频率大于 1 的元㖊。

算法流程:

  1. 创建一个 32-bit 的整数 'res',初始值为 0
  2. 遍历数组 'arr' 中的每个元㖊 'x'
    • 'res''x' 进行按位与运算,即 'res = res & x'
  3. 判断 'res' 是否为 0
    • 如果 'res'0,则说明没有元㖊重复出现了,'return false'
    • 如果 'res'0,则说明至少有一个元㖊重复出现了,'return true'

时间复杂度: O(n),n 为数组长度。按位与运算的时间复杂度为常数。

空​​间复杂度: O(1),因为只使用了一个 32-bit 的整数 'res'

复杂度解析:

位运算法的时空复杂度均优于哈希表法。它仅需一个 32-bit 的整数来存储数组中所有元㖊出现的频率信息,避免了哈希表中需要存储所有不同的元㖊的开销。

总结

LeetCode 217 题是判断数组中是否存在重复元㖊的经典问题。哈希表法是最为直观和易于上手的解法。而位运算法则更为巧妙,它巧妙地将数组中所有元㖊的频率信息融入一个 32-bit 的整数中。

不同的解法各有千秋,哈希表法适用于元㖊种类较多的场景,位运算法则适用于元㖊种类较少且数据范围较小的场景。