约瑟夫环是这样的描述:有n个孩子围坐成一圈,编号为0~n-1。现在让这些孩子报数,从0~m-1依次报数。报到m-1的孩子退出圈。求最后留在圈里的孩子。
下面直接看这个问题的数学解法:
上面的数学推到已经完成了,所以代码实现:
//n代表有多少人在玩这个游戏 //m代表报数的范围是0~m-1 int LastRemaining_Solution(unsigned int n, unsigned int m) { if(n == 0) { return -1; } int s = 0; if(n == 1) { return s; } for(int i = 2; i <= n; i++) { s = (s + m) % i; } return s; }
注意这种算法中每个人的编号不是一成不变的,每淘汰一个人,都要把这个人的下一个人当成是0号位置,对所有的人重新编号。