如果我们在 while 循环中有一个 while 循环,我们会增加复杂性吗? (即使使用指针)

if we have a while loop inside while loop, do we multiply complexities? (even though pointers are used)

下面是一些代码,它包含一个整数列表、nums 和一个目标整数 target,returns nums 中的两个整数加起来就是 target:

def twoSum(nums, target):
    pointer_stat = 0
    pointer_run = 1

    while pointer_stat < len(nums):

        while pointer_run and pointer_stat < len(nums):
            if nums[pointer_stat] + nums[pointer_run] == target:
                return [nums[pointer_run],nums[pointer_stat]]

            pointer_run +=1

        pointer_run = 1
        pointer_stat +=1


print(twoSum(nums,target))

我的问题是,或者更确切地说,我想确认以上是否是 O(n^2) 运行时间?

我的推理是我们有两个指针将指向列表中的每个整数,并且两个指针将分别遍历列表一次(因此复杂度为 O(N)),并且由于我们在内部有一个循环一个循环,我们将 O(N) 和 O(N) 相乘得到 O(N^2)

并且 space 复杂度为 O(1)。

你是对的,但是 O(n^2) 是 最坏情况 时间复杂度,因为你在循环中包含一个 return 语句,这可能导致退出早点双循环。

请注意,您可能需要

while pointer_run < len(nums) and pointer_stat < len(nums):

而不是

while pointer_run and pointer_stat < len(nums):

因为这可能会导致您的循环无法停止(小于比“and”更强的绑定)和 运行 无限期。

您可以实际测试并亲自查看:

import matplotlib.pyplot as plt
x=[]
y=[]
n=[1]
def twoSum(nums, target):
    pointer_stat = 0
    pointer_run = 1
    iterations = 0

    while pointer_stat < len(nums):

        while pointer_run < len(nums) and pointer_stat < len(nums):
            if nums[pointer_stat] + nums[pointer_run] == target:
                return [nums[pointer_run],nums[pointer_stat]]
            iterations +=1 
            pointer_run +=1

        pointer_run = 1
        pointer_stat +=1
        x.append(len(nums))
        y.append(iterations)
    return True

for i in range(100):
    n.append(1)
    twoSum(n,10000)

plt.plot(x,y)
plt.xlabel('N')
plt.ylabel('Iterations')
plt.show()