LeetCode #217存在重复元素:我的Python代码问题出在哪?
问题:为什么用
nums.count(x) ==1的与运算取反无法正确判断数组是否存在重复? 嘿,我来帮你拆解下这个问题~首先咱们先理清楚你的思路:你想通过判断所有元素的出现次数都是1(用all(nums.count(x) == 1 for x in nums)),然后取反得到“是否存在重复元素”的结果。这个逻辑本身是逻辑正确的,但它会出现“无法正常运行”的情况,主要有两个核心原因:
1. 时间复杂度爆炸,导致超时
nums.count(x)方法的底层是遍历整个数组来统计x的出现次数。如果你的数组长度是n,那么对每个元素都调用一次count,总时间复杂度就是O(n²)。当数组规模很大时(比如LeetCode测试用例里的十万级元素数组),这个方法会因为运行时间过长而超时,看起来就像“无法正常运行”。
举个例子:如果数组有10000个元素,你的代码需要执行10000次完整的数组遍历,总共做1亿次元素比较,这在时间限制内根本跑不完。
2. 不必要的重复计算
当数组里有重复元素时,你会多次统计同一个元素的出现次数。比如数组是[2,2,3],你会对第一个2调用count得到2,对第二个2又调用一次count还是得到2——这完全是重复劳动,进一步拖慢了运行速度。
更高效的正确解法
针对这个问题,有两种非常高效的常用解法:
解法1:利用集合的唯一性(最优解)
集合的特性是元素不重复,所以只需要比较原数组的长度和转换为集合后的长度:如果长度不同,说明存在重复元素。这个方法的时间复杂度是O(n),因为转换集合的过程只需要遍历一次数组。
def containsDuplicate(nums): return len(set(nums)) != len(nums)
解法2:排序后检查相邻元素
先对数组排序,然后遍历检查是否有相邻元素相等。排序的时间复杂度是O(n logn),后续遍历是O(n),整体效率也远高于你的原方法。
def containsDuplicate(nums): nums.sort() for i in range(len(nums)-1): if nums[i] == nums[i+1]: return True return False
内容的提问来源于stack exchange,提问作者Zhengyan
相关产品推荐
相关产品推荐

