leetcode 面试题62. 圆圈中最后剩下的数字(约瑟夫环)
题目描述:
0,1,,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。
例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。
题解:
剑指offer上也刷到过简单记录一下。
定义f(n,m)为0,1...n-1这n个数字排一圈每次删除第m个数字之后剩下的数字。在删除第m个数字之后,剩下了n-1个数字,我们对其重新编号为0,1,...n-2。如下所示:
原始 0 1 2 3 4 5 6 7 8 9
旧环 0 1 2 4 5 6 7 8 9
新环 6 7 8 0 1 2 3 4 5
假设f(n,m)(旧环)对应的编号为x1,f(n-1,m)(新环)重新编号之后的编号为x2,x1 = (x2+m%n)%n,也就是说 f(n,m) = (f(n-1,m)+m%n)%n。当n==1的时候,无论m
等于多少,因为只有0这一个元素,return 0就好了。递归求解就好了。
AC代码:
class Solution { public: int lastRemaining(int n, int m) { if(n == 1) return 0; int tmp = lastRemaining(n-1,m); return (tmp+m%n)%n; } };