package problem;
/**
* 约瑟夫环问题,假设有10个孩子,则初始编号为 0,1,2,3,4,5,6,7,8,9
* m = 3, 即每次报到 m-1=2的孩子出局
* 第一轮 2号出局 剩下 0 1 3 4 5 6 7 8 9
* 第二轮从3开始计数,我们重新编号 7 8 0 1 2 3 4 5 6
* 显然第二轮出局的人也是2,但这个2在原始数组里的编号是多少呢,很明显可以观察到 2 + 3 = 5
* 进一步,我们发现第二轮每个编号 x对应原数组的编号为 (x+3) % 10
* 可以推断,第三轮还原对应第二轮编号就是 (x+3) % 9
*/
public class Test5
{
public int LastRemaining_Solution(int n, int m) {
if(n <= 0 || n <= 0) return -1;
int result = 0;//最后一轮只剩一个人,他最后的编号肯定是0
for(int i=2;i<=n;i++){
result = (result + m) % i; //一轮一轮往上还原
}
return result;
}
}
【剑指offer】孩子们的游戏
最新推荐文章于 2020-07-27 11:51:59 发布