题目分析
约瑟夫环问题
- f(n, m) = (f(n – 1, m) + m) % n
如果编号从1开始,即结果+1,向后一个
Solution
public int lastRemaining1(int n, int m) {
return (n == 1) ? 0 : (lastRemaining1(n - 1, m) + m) % n;
}
// f(1, 3) = 0
// f(2, 3) = (f(1, 3) + 3) % 2
// ...
// f(7, 3) = (f(6, 3) + 3) % 7
// f(8, 3) = (f(7, 3) + 3) % 8
// f(9, 3) = (f(8, 3) + 3) % 9
// f(10, 3) = (f(9, 3) + 3) % 10
public int lastRemaining(int n, int m) {
int res = 0;
for (int i = 2; i <= n; i++) { // i是数据规模,代表有多少个数字(有多少个人)
res = (res + m) % i;
}
return res;
}
Reference:小码哥MJ