1、递归
我们可以递归的调用函数 f ( n , m ) f(n,m) f(n,m)用于返回长度为 n n n的数组再仅剩下一个数字时的序号。我们只需要递归使用该函数,就知道最后删除的数是当前 m % n m\%n m%n开始的第 x x x个数。
class Solution {
int f(int n, int m) {
if (n == 1) {
return 0;
}
int x = f(n - 1, m);
return (m + x) % n;
}
public:
int lastRemaining(int n, int m) {
return f(n, m);
}
};
2、双指针
将上述递归过程改为迭代可以得到如下:
class Solution {
public:
int lastRemaining(int n, int m) {
int f = 0;
for (int i = 2; i != n + 1; ++i) {
f = (m + f) % i;
}
return f;
}
};