leetcode 287的时间复杂度

时间:2019-11-06 22:45:20

标签: arrays python-3.x list

如果您访问leetcode.com/problems/find-the-duplicate-number/solution/(问题287),则给出以下解决方案:

def findDuplicate(self, nums):
    seen = set()
    for num in nums:
        if num in seen:
            return num
        seen.add(num)

此解决方案的时间复杂度表示为O(n)

我试图弄清楚为什么会这样。我考虑的方式是是否获得以下列表:

x = [1,2,3,4,5,6,7,8,9,10,11,.... 98,99,100,100] 即数字不断增加(或不相同),直到末尾重复的数字 数组

然后,当您遍历每个元素时,集合的大小将不断增加,以寻找重复的值。这会不会比O(N)时间长?

具体来说,如果您尝试在集合中查找98,则必须查看97(N-4)个值以查看它是否不在集合中,然后将其添加。对于99,您要查看98个值,等等。在最坏的情况下,这似乎是O(N ^ 2)解决方案?

1 个答案:

答案 0 :(得分:0)

在某种程度上,您的观点是正确的。 以一个示例为例,让找到的数字为100。因此,使用“ for”循环进行循环将为O(n),然后在集合中查找值将为O(n)/ O(1)。

用于查找集合中值的平均时间复杂度为O(1),而最坏情况下的复杂度为O(n)。在这种情况下,我们具有最坏的情况下的复杂度,因此复杂度os O(n ^ 2)。

但是,如果您阅读leetcode给出的解决方案,他们会提到“摊销的恒定时间复杂性”,这意味着有时可能会出现最坏的情况。因此,他们基本上忽略了它,而是查看了平均时间复杂度,得出O(1)。

因此,时间复杂度为O(1)。