【发布时间】:2017-03-03 05:12:44
【问题描述】:
给定一个包含 n + 1 个整数的数组 nums,其中每个整数都介于 1 和 n(含)之间,证明至少存在一个重复数。假设只有一个重复号码,找到重复号码。
我的解决方案:
def findDuplicate(nums):
slow = fast = finder = 0
while fast is not None:
slow = nums[slow]
fast = nums[nums[fast]]
if fast is slow:
return slow
return False
nums = [1,2,2,3,4]
print findDuplicate(nums)
我的上述解决方案有效并给了我 o/p 2 但它不适用于每个输入,例如它不适用于 [11,15,17,17,14] 或 [3,1,2,6,2,3] 并给我错误 IndexError: list index out of range。我无法找到模式,也无法找到确切的问题。还试图改变我的 while 条件:
while fast is not None and nums[nums[fast]] is not None:
您的帮助将不胜感激!谢谢。
【问题讨论】:
-
你想要的输出是什么
-
我相信您的第一个示例
[11,15,17,17,14]不满足您对问题的描述:列表包含5元素,但这些元素不在1 和5 - 1 = 4之间。对于第二个示例[3,1,2,6,2,3],请注意 Python 的列表是 0 索引的,因此 6 是越界的。也就是说,你有一个错误。 -
我相信通常的解决方案是对数组进行排序,然后查找两个相邻的相等值。给定约束并排序后,每个索引处的值应为 index+1。一旦你找到一个不存在的值,你就找到了该对的一个实例。另一个实例将位于前一个索引处。
-
不幸的是,我不得不说您的代码与给定的任务无关。除了
return slow之外,函数中的每一行基本上都有问题。我建议重新开始并重新考虑您的方法。 -
Find duplicate element in array in time O(n) 的可能重复项。您尝试采用的方法是“周期检测”方法。上面的代码可能看起来有点奇怪,但它正朝着占用
O(n)和O(1)空间的解决方案走上正轨。请参阅here 以获得针对此问题提供完整 Python 解决方案的答案。
标签: python