难度简单
0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。
例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。
示例 1:
输入: n = 5, m = 3 输出: 3
示例 2:
输入: n = 10, m = 17 输出: 2
约瑟夫环问题:
当经历n-1轮后,此时只剩下1个人(胜利者),在第n轮,其编号一定是0。所以我们令f(1) = 0,即最后一轮游戏时(第n轮),胜利者的编号为0。
倒推第n-1轮,此时,有2个人,胜利者此轮的编号为f(2) = (f(1) + k) % 2。
倒推第n-2轮,此时,有3个人,胜利者此轮的编号为f(3) = (f(2) + k) % 3。
不难看出递推公式:f(n) = (f(n - 1) + k) % n
class Solution {//约瑟夫环
public int lastRemaining(int n, int m) {
int p=0;// 当只有一人的时候 胜利者下标肯定为0
// 最后一轮剩下2个人,所以从2开始反推
for(int i=2;i<=n;i++){
p = (p + m) % i;// 每多一人 胜利者下标相当于往右挪动了m位,再对当前人数取模求得新的胜利者下标
}
return p;
}
}