剑指offer刷题记录61--圆圈中最后剩下的数字

剑指offer刷题记录61--圆圈中最后剩下的数字
来自力扣大佬的解析

解题思路

阅读提示(全文最重要的点):只关心最终活着那个人的序号变化

1 约瑟夫问题

这个问题实际上是约瑟夫问题,这个问题描述是:N个人围成一圈,第一个人从1开始报数,报M的将被杀掉,下一个人接着从1开始报。如此反复,最后剩下一个,求最后的胜利者。

2 问题转换
剑指offer刷题记录61--圆圈中最后剩下的数字
从8个人开始,每次杀掉一个人,去掉被杀的人,然后把杀掉那个人之后的第一个人作为开头重新编号。
1)第一次C被杀掉,人数变成7,D作为开头,(最终活下来的G的编号从6变成3)
2)第二次F被杀掉,人数变成6,G作为开头,(最终活下来的G的编号从3变成0)
3)第三次A被杀掉,人数变成5,B作为开头,(最终活下来的G的编号从0变成3)以此类推,当只剩一个人时,他的编号必定为0!(重点!)
剑指offer刷题记录61--圆圈中最后剩下的数字
剑指offer刷题记录61--圆圈中最后剩下的数字
代码如下
剑指offer刷题记录61--圆圈中最后剩下的数字