精彩的讲解:
https://www.cnblogs.com/qilinart/articles/4555825.html
https://blog.csdn.net/u011500062/article/details/72855826
原题
0,1...n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。
1. 使用模拟链表
public class Solution {
public int lastRemaining(int n, int m) {
if (n == 1) return 0;
if (m == 0) return n - 1;
ArrayList<Integer> list = new ArrayList<>(n);
for (int i = 0; i < n; i++) list.add(i);
int index = 0;
int size = n;
while(size > 1) {
index = (index + m - 1) % size;
list.remove(index);
size--;
}
return list.get(0);
}
}
2. 使用数学解法
递推公式:f(N,M)=(f(N−1,M)+M)%N
这个公式描述的是:幸存者在这一轮的下标位置
f(N,M)表示,N个人报数,每报到M时杀掉那个人,最终胜利者的编号
f(N−1,M)表示,N-1个人报数,每报到M时杀掉那个人,最终胜利者的编号
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;
}
}
网友评论