面试题62:圆圈中最后剩下的数字
文章目录
题目
0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。
例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。
考点
“约瑟夫环问题”
记0,1,…,n-1,删除第m个数字为f(n,m),删除的数字为(m-1)%n,删除后下一个数字为m%n, 记为t
f(n,m)的数字环为
0,1,…,n-1
f(n-1,m)的数字环为
0,1,…,n-2
删除第m个数字后的排列为:
t,t+1,t+2,…,0,1,2,…,t-3,t-2 即为f(n-1,m)的排列
因此f(n-1,m)中某一位置x,在f(n,m)的位置为 (x+t)%n,即(x+m%n)%n
即(x+m)%n
f(1,m)的位置为0
综上可得以下代码
LeetCode版本
class Solution {
public:
int lastRemaining(int n, int m) {
int res =0;
for(int i = 2; i<=n; i++){
res = (res+m)%i;
}
return res;
}
};