返回
LeetCode 217:是否存在重复元㖊?人工智能带你一一剖析
Android
2023-11-06 19:26:50
题目概览
给定一个整数数组 'arr'
,请你判断是否存在至少一个元㖊在该数组中重复出现了。
示例:
- 输入:
[1,2,3,4,5,1,2]
- 输出:
true
提示:
- 数组长度在
[1, 10^5]
范围内。 - 数组中每个整数在
[-10^9, 10^9]
范围内。
解题思路
哈希表法
哈希表是本题最直观的解法。其核心思想在于:
- 创建一个哈希表,将数组中的每个元㖊及其对应频率映射起来。
- 遍历数组中的每个元㖊,若其频率大于 1,则说明该元㖊重复出现了。
算法流程:
- 创建一个哈希表
'table'
,初始时所有元㖊的频率均为 0。 - 遍历数组
'arr'
中的每个元㖊'x'
:- 如果
'table'
中没有'x'
,则将其加入哈希表,并将其频率初始化为 1。 - 否则,将
'table[x]'
增加 1。
- 如果
- 遍历哈希表
'table'
,若找到频率大于 1 的元㖊,则说明该元㖊重复出现了,直接退出循环并'return true'
。 - 遍历完毕,若未找到重复元㖊,则说明数组中没有重复元㖊,
'return false'
。
时间复杂度: O(n)
,n 为数组长度。哈希表对每个元㖊的访问和频率的判断均为常数时间复杂度。
空间复杂度: O(n)
,哈希表中需要存储数组中所有不同的元㖊。
复杂度解析:
哈希表法的时间复杂度由哈希表的操作决定。哈希表的常数时间复杂度为 O(1)
,而数组长度为 n
。
扩展:进阶解法
位运算法
位运算是一种更为巧妙的解法。其原理在于:
- 将数组中所有元㖊的二进制位表示分别与一个 32-bit 的整数进行按位与运算。
- 运算后的整数将包含数组中所有元㖊出现的频率信息。
- 利用按位与运算,我们可以判断是否存在频率大于 1 的元㖊。
算法流程:
- 创建一个 32-bit 的整数
'res'
,初始值为0
。 - 遍历数组
'arr'
中的每个元㖊'x'
:- 将
'res'
与'x'
进行按位与运算,即'res = res & x'
。
- 将
- 判断
'res'
是否为0
:- 如果
'res'
为0
,则说明没有元㖊重复出现了,'return false'
。 - 如果
'res'
非0
,则说明至少有一个元㖊重复出现了,'return true'
。
- 如果
时间复杂度: O(n)
,n 为数组长度。按位与运算的时间复杂度为常数。
空间复杂度: O(1)
,因为只使用了一个 32-bit 的整数 'res'
。
复杂度解析:
位运算法的时空复杂度均优于哈希表法。它仅需一个 32-bit 的整数来存储数组中所有元㖊出现的频率信息,避免了哈希表中需要存储所有不同的元㖊的开销。
总结
LeetCode 217 题是判断数组中是否存在重复元㖊的经典问题。哈希表法是最为直观和易于上手的解法。而位运算法则更为巧妙,它巧妙地将数组中所有元㖊的频率信息融入一个 32-bit 的整数中。
不同的解法各有千秋,哈希表法适用于元㖊种类较多的场景,位运算法则适用于元㖊种类较少且数据范围较小的场景。