一、题目描述
0, 1, ..., n - 1
这n
个数字排成一个圆圈,从数字0
开始每次从这个圆圈里删除第m
个数字。求出这个圆圈里剩下的最后一个数字。
输入:
每组数据一行,包含2
个整数n
和m
,分别表示0
到 n - 1
的序列和指定删除的第m
个数字。
输出:
输出能保留到最后的那个数字。
样例输入:
5 3
样例输出:
3
二、题目分析
经典的约瑟夫环问题,最简单粗暴的方法就是用数组或者环形链表模拟整个删除元素的过程,这里使用标准库的list
实现了环形链表,在遍历时需注意,当迭代器遍历到链表的结尾时,需将其重新指向链表的头部。
另一种网上讨论很多的方法是使用数学推导的方法求出递推式,从而实现O(n)
的时间复杂度和O(1)
的空间复杂度。但这一推导过程比较困难,网上的讲解有很多,这里引用别人的推导步骤:
(1)对于n个数组成的序列,第一次被删除的数为:(m - 1) % n
。
(2)假设第二轮删除时,初始数字为m % n
。令k = m % n
,则对于剩下的n - 1
个数构成的约瑟夫环为:k, k + 1, k + 2, k +3, .....,k - 3, k - 2
。做一个映射如下:
k ------> 0
k+1 ------> 1
k+2 ------> 2