龟兔赛跑算法详解

龟兔赛跑算法(Floyd's Tortoise and Hare/Circle Detection)用于判断链表是否有环.

使用两个指针,一个慢的每次走一步,一个快的每次走两步.

可以在O(n)的时间复杂度和O(1)的空间复杂度解决如下三个问题:

 

1. 判断链表是否有环?

两个指针相遇了,肯定有环.(例题)

为什么有环就会相遇呢?

证明:

令:  head=头节点;  entry:环的入口处节点;  meeting:相遇时所在的节点.

   C=环的长度;  L1=head到entry的距离;  L2=entry到meeting的距离.

   慢的每次走一步(速度为1),快的每次走两步(速度为2).同时出发,相遇时有:

   L1+L2+n1*C = (L1+L2+n2*C)/2    化简得:

   L1 = (n2-2*n1)*C-L2  

   其中L1 和C是定值,这个等式显然有解,所以会相遇.

 

2. 环的长度?

相遇后,一个不动,另一个一步一步走一圈,再次相遇时,走过的路程就是环的长度.

 

3. 环的入口?(例题)

根据L1 = (n2-2*n1)*C-L2  

L1实际上等于先转几圈加上最后一圈减去L2

所以再让一个节点从head出发,一个节点从meeting出发,同时走,每人每次一步,最后相遇肯定在entry节点,也就找到了entry节点. 

 图示:

 

转载于:https://www.cnblogs.com/zywscq/p/10727079.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Scratch是一款教育性编程软件,它通过图形化编程方式帮助学生学习编程知识。在Scratch中,我们可以利用素材和代码来创建各种有趣的项目,其中包括了龟兔赛跑。 首先,我们需要准备龟兔赛跑素材。在Scratch中,我们可以选择预设的龟兔精灵或者自己上传自定义的龟兔精灵。对于一个龟兔赛跑项目,我们需要一只乌龟和一只兔子两个精灵。 接下来,我们可以创建舞台,并设计赛道。舞台可以是一个绿色的草地,赛道可以是两条不同颜色的线。可以使用Scratch提供的绘图功能,在舞台上绘制出一条赛道。 然后,我们需要编写代码来实现龟兔赛跑的逻辑。为了让龟兔能够在赛道上移动,我们可以利用Scratch提供的运动积木块来移动精灵。例如,我们可以利用前进和后退积木块来控制它们的移动速度和方向。 我们还可以为乌龟和兔子添加一些特殊效果,使得比赛更加有趣。例如,我们可以添加一个计时器来记录比赛的时间,并且在比赛结束时显示出来。我们还可以设计一些障碍物,让乌龟和兔子在赛跑过程中遇到一些挑战。 最后,我们需要设置比赛的规则和结束条件。例如,比赛可以是跑到终点线的先到者获胜,或者是谁先跑完指定的距离。 总之,通过Scratch,我们可以利用素材和代码来创作一个有趣的龟兔赛跑项目。这不仅可以帮助学生学习编程,还能培养他们的逻辑思维和创造力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值