以下是函数O(n)时间和O(1)空间,其中n = | A |?

时间:2016-09-19 15:34:59

标签: python algorithm time-complexity

def firstMissingPositive(self, A):
    least = 1024*1024*1024
    # worst case n ops
    for i in A:
        if i < least and i > 0:
            least = i
    if least > 1:
        return 1
    else:
        # should be O(n)
        A_set = set(A)
        # worst case n ops again
        while True:
            least += 1
            if least not in A_set:
                return least

我只是问,因为对于给定的问题来说这似乎太简单了,这里的大多数人可能已经在Leetcode或类似的地方看到过。在Python的set或dict实现中有没有我不知道的东西?查找应该是O(1)并且将列表转换为集合应该是我理解的O(n)。

1 个答案:

答案 0 :(得分:2)

它不是O(1)空格,而是O(n)空格,因为您需要构建集合。

至于时间,根据the Python wiki,设置包含需要O(n)最坏的情况。因此,您的算法是O(n^2)。请注意,这是最糟糕的情况 - 集合限制的平均时间为O(1),因此算法的平均时间复杂度确实为O(n)

您可以使用有序集将最差情况降至O(n log n),但平均时间也将为O(n log n)