约瑟夫环

题目描述:

  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 }

 

  

posted @ 2012-04-27 13:35  可乐爱上了雪碧  阅读(186)  评论(0编辑  收藏  举报