剑指offer2之圆圈中最后剩下的数字

题目(圆圈中最后剩下的数字)

0,1,…,n-1 这 n 个数字排成一个圆圈,从数字 0 开始,每次从这个圆圈里删除第 m 个数字。求出这个圆圈里剩下的最后一个数字。

算法思路

题目描述了一个圆圈来编排数字,那么就该想到可以用环形链表这种数据结构来表示它。另外,可以借助 STL 中用链表实现的 list 来模拟环形链表,只要我们在遍历到尾巴的时候,手动再跳到链表表头即可实现类似环形链表的效果。
那么算法每确定从一个数开始,就走到第 m 个数,然后删掉第 m 个数,同时确定下一个开始的数字。在这过程中,都要判断是否走到了链表尾部。

算法实现

复杂度分析

算法每删除一个数字需要走 m 步,共有 n 个数字,因此时间复杂度为 O(mn);另外,使用了辅助链表来模拟圆圈,空间复杂度是O(n)。

参考

[1] <<剑指offer2>>
[2] 牛客网

-------------本文结束感谢您的阅读-------------