题目传送门
题解
- 解法一:暴力
O(n2)
- 解法二:递归
设
f[n,m]表示题意所求。则首先明确
f[1,m]=0(一个人肯定就是自己了)
采用自底向上的方式,设
x=f[n−1,m]
当前长度为
n,那么本次会删除
n%m 的位置,变成长度为
n−1。
而我们已经知道了,长度为
n−1 的时候,最后一名所在位置是
x
所以
f[n,m]=(m%n+x)%n=(f[n−1,m]+m)%n
- 解法三:迭代
由解法二可知,递归可以转变为迭代求解。
- 最终:时间复杂度
O(N),空间复杂度
O(1)
AC-Code
class Solution {
public:
int LastRemaining_Solution(int n, int m) {
if(n <= 0) return -1;
int x = 0;
for(int i = 2; i <= n; ++i) {
x = (x + m) % i;
}
return x;
}
int dfs(int n, int m) {
if(n == 1) return 0;
int x = dfs(n - 1, m);
return (x + m) % n;
}
};