两和问题的时间复杂度是多少?

时间:2021-03-22 18:16:20

标签: python time-complexity big-o

我正在练习我的大 O 符号,需要一些清晰度。 这是我从 Leet 代码两个和问题中得到的解决方案。基本上给定一个列表和一个目标值,返回加起来为目标的两个索引。 例如

twoSum([1,2,3,4],7)

将返回 [2,3]

我在leetcode上可以看到解决方案,但是我想检查一下我对这段代码的评估是否正确。时间复杂度 = O(n squared),因为在外循环中对数组进行了 in 操作。 这是正确的吗?

代码是

def twoSum_n2(nums, target):
    for idx, value in enumerate(nums): #O(n)
        diff = target - value # O(1)
        try:
            diff_idx = nums.index(diff) #O(n)
        except ValueError as ex:
            continue
        if idx != diff_idx: # O(1)
            return [idx, diff_idx] #O(1)
    return [] 

2 个答案:

答案 0 :(得分:1)

是的,在您当前的实现中,它是 O(n^2),因为您在另一个 O(n) 中有一个 O(n)。当我们遇到类似的情况时,我们需要将这些 O-s 的值相乘。

答案 1 :(得分:1)

diff_idx = nums.index(diff) #O(n)

上面的行将运行 n 次,因为它在遍历 nums 列表的 for 循环中。因此,检查的总次数为 O(n^2) 次,复杂度为 O(n^2)。