这篇文章是我通过灵感所写的是一种全新的理解约瑟夫环的方法,希望能帮到一些还没有理解的朋友。所以我会尽力详细的讲述这篇文章。
面试题62. 圆圈中最后剩下的数字
0,1,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。
示例 1:
输入: n = 5, m = 3
输出: 3
示例 2:
输入: n = 10, m = 17
输出: 2
在这前我们先来了解一下约瑟夫环问题:
17世纪的法国数学家加斯帕在《数目的游戏问题》中讲了这样一个故事:15个教徒和15 个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法:30个人围成一圆圈,从第一个人开始依次报数,每数到第九个人就将他扔入大海,如此循环进行直到仅余15个人为止。问怎样排法,才能使每次投入大海的都是非教徒。(还有另一个版本但是他太长了==)
如果死去的人灵魂还能占着空位,这题会变的非常简单,如果我们每次扔进海里一个就重新从开头数数,这题也会非常简单,然而并不能,所以约瑟夫环的问题就有两个:
1:我们没有固定的环长,意味着我们数着的数肯定不成倍数增加(也就是没有什么明显的规律):
2:没有固定的开始地点,这个人被扔海里接着数后面的,所以我们之后的会受到环长的影响。
感谢在我尝试理解约瑟夫环的过程中,一位大佬的文章里提到了
每当一个人被推进海里时,所有的索引值会前进m,
也就是我们每次数到就要杀人的那个数,所有的索引值都要前进m,为什么,我们不是死了一个人吗,为什么索引值前进了那么多呢”但是,随着思考我突然冒