约瑟夫环
题目描述:
0,1,……, n-1 这n个数字排成一个圆圈, 从数字0开始每次从这个圆圈里删除
第m个数字。求这个圆圈里剩下的最后一个数字。
思路:
第一次删除之后:
0,1,……,m-2,m, ……,n-1
因为第二次变换从m开始,经过变换(- m):
-m,1-m,……,-2,0,1,……,n-1-m 共n-1个
从第二次变到第一次的映射为:p(x)= (x + m)% n;
也就是说,如果在n-1个数中最后剩下的数字为x,那么推到在n个数中最后剩下的数字
为p(x),问题的解可以由子问题给出,初始化条件为n=1时,p(x) = 0;
书上的关系表示为:f(n, m) = [f(n-1, m) + m] % n (n >1, f(1, m) = 0);
参考资料:
[1] 《剑指offer》 何海涛 P231
代码:
1 int LastRemaining (unsigned int n, unsigned int m) 2 { 3 if(n < 1 || m < 1) 4 return -1; 5 int last = 0; 6 for(int i = 2; i <= n; i ++) 7 last = (last + m) % i; 8 return last; 9 }