【发布时间】:2021-02-10 03:25:43
【问题描述】:
我试图解决这个 leetcode 问题https://leetcode.com/problems/find-the-duplicate-number/,使用我自己的龟兔算法实现,当给定以下整数数组时,会导致无限循环:
[3,1,3,4,2]
只有在跟踪我的算法后,我才能看到慢跑者和快跑者永远不会同时接受两个重复值。这是我的伪代码算法:
initialize fast and slow runners to 0
while(true)
move fast runner two indices forward
move slow runner one index forward
if arr[fast] == arr[slow] and fast != slow
return arr[fast] // this is the duplicate
现在,我确信精通离散数学的人能够直观地知道,如果不首先像我必须做的那样追溯一个示例,这种方法不会导致正确的解决方案。
我可以做出哪些推论或观察来让我看到这个算法不起作用?我想知道如何通过一系列逻辑语句直观地识别此逻辑中的缺陷。换句话说,为什么这两个跑步者永远不会在这个例子中找到重复项的解释是什么?我觉得这可能与计数有关,但我在离散方面没有很强的背景。
为了澄清,我已经查看了正确的实现,所以我知道解决它的正确方法是什么。我只是认为这种方式与将其应用于链表太相似了,在链表中,您可以将快跑者上移两个节点,将慢跑者上移一个节点。感谢您的帮助。
【问题讨论】:
-
您似乎希望该算法能够探索数组索引的每个组合。兔子有 5 个索引,乌龟有 5 个索引,所以总共有 25 种可能的组合。问题是兔子在 5 次移动后就抓住了乌龟,所以他们将探索 25 种可能组合中的 5 种,特别是 {1,2}、{2,4}、{3,1}、{4,3} , {0,0}。这些都不是您要寻找的组合:{0,2}。为什么兔子跑了5步就抓到了乌龟?乌龟移动了5个位置,兔子移动了10个位置,都回到了起点。
-
很好的解释。我想我只是没有意识到只有 5 种组合会被探索。
标签: algorithm logic discrete-mathematics