该问题在数组中找到两项合计为目标值的项。 它返回一个带有正确值索引的数组。
我认为时间复杂度是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
答案 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
时间(尤其是如果提供给您的测试集试图针对哈希冲突)。