约瑟夫环c语言单链表的解题思路,太透彻了:约瑟夫环的三种解法

本文深入探讨了约瑟夫环问题,提供了循环链表模拟、有序集合模拟和递归公式三种解题方法。通过这些方法,可以有效地解决当n个人围成一个圈,每隔m个数剔除一个人,直到剩下最后一个人的问题。循环链表模拟直观但效率低下,有序集合模拟优化了删除操作,递归公式解法则避免了模拟操作,提高了效率。
摘要由CSDN通过智能技术生成

dcaf1e4cf3deebfb3b76874d90a95a86.png

【CSDN 编者按】极大概率出现在面试中的约瑟夫环问题来啦,本文三种方法描述解题思路,这样讲解绝对让面试官眼前一亮。

作者 | bigsai 责编 | 欧阳姝黎

前言

约瑟夫环问题是算法中相当经典的一个问题,其问题理解是相当容易的,并且问题描述有非常多的版本,并且约瑟夫环问题还有很多变形,这篇约瑟夫问题的讲解,一定可以带你理解通通!

什么是约瑟夫环问题?

约瑟夫环问题在不同平台被"优化"描述的不一样,例如在牛客剑指 offer 叫孩子们的游戏,还有叫杀人游戏,点名……最直接的感觉还是力扣上剑指 offer62 的描述:圆圈中最后剩下的数字。

问题描述:

0,1,···,n-1 这 n 个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第 m 个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。 例如,0、1、2、3、4 这 5 个数字组成一个圆圈,从数字0开始每次删除第 3 个数字,则删除的前 4 个数字依次是2、0、4、1,因此最后剩下的数字是3。

当然,这里考虑 m,n 都是正常的数据范围,其中

1 <= n <= 10^5

1 <= m <= 10^6

对于这个问题,你可能脑海中有了印象,想着小时候村里一群孩子坐在一起,从某个开始报数然后数到几出列,下一个重新开始一直到最后一个。不同人用不同方法解决,青铜直接模拟,钻石会优化一下,王者用公式,下面详细给大家讲解思路。

循环链表模拟

这个问题最本质其实就是循环链表的问题,围成一个圈之后,就没有结尾这就是一个典型的循环链表嘛!一个一个顺序报数,那不就是链表的遍历枚举嘛!数到对应数字的出列,这不就是循环链表的删除嘛!

4127e262ee9690677a4a7153570ab662.png

链表模拟

并且这里还有非常方便的地方:

循环链表的向下枚举不需要考虑头尾问题,直接 node=node.next 向下

循环链

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值