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