该代码的时间复杂度是否为O(n ^ 2)?

时间:2019-05-20 18:07:11

标签: python python-3.x time-complexity

该问题在数组中找到两项合计为目标值的项。 它返回一个带有正确值索引的数组。

我认为时间复杂度是n ^ 2,因为while循环在数组中运行了n次。在最坏的情况下,它必须重复n次。所以n * n运行时间。

即使每次必须迭代的元素数量都减少,我们在calc时也会删除常量。时间复杂度。

此分析正确吗? 有什么建议可以将其降低到n?

def twoSum(nums, target):

    indx = []
    size = len(nums)

    if (size < 2):
        return indx

    x = 0
    y = size - 1

    while(x < y):

        if( (nums[x] + nums[y]) == target):
            indx[0] = x
            indx[1] = y
            break
        elif ( (y - 1) == x):
            x = x + 1
            y = size - 1
        else:
            y = y -1

    return indx

1 个答案:

答案 0 :(得分:3)

您可以做O(n),这是一个Google面试问题,我相信他们在YouTube上有一个视频。或者至少他们有一个非常相似的问题:

def twoSum(nums, target):
    values = dict()
    for index, n in enumerate(nums):
        if target - n in values:
            return values[target - n], index
        else:
            values[n] = index


print(twoSum([4, 5, 2, 1, 3], 4)) # (3, 4)

-编辑-
根据下面的评论,从技术上讲,此解决方案在O(n^2)哈希冲突方面表现最差。在大多数情况下,您应该接近O(n),但是如果您使用大量数字(正数或负数),则会发现碰撞次数增加,这将导致n * log(n)n^2时间(尤其是如果提供给您的测试集试图针对哈希冲突)。