核心是递推公式,n个数,每m-1个出列,最后保留数为f(n,m),f(n,m)=[f(n-1,m)+m]%n。
推导过程参考:http://zhedahht.blog.163.com/blog/static/2541117420072250322938/
/*
*实用递推公式递归
*O(1) O(n)
*/
public static int Solution(int n, int m) {
if (n <= 0) {
return -1;
}
if (n == 1) {
return 0;
}
return (Solution(n-1, m)+m)%n;
}
//实用Linkedlist循环
//O(n) O(n)
public static int Solution1(int n, int m) {
if (n <= 0) {
return -1;
}
List<Integer> list = new LinkedList<>();
for(int i = 0; i < n; i++) {
list.add(i);
}
int i = 0;
while(list.size()>1) {
int size = list.size();
i = (m -1 + i) % size;
list.remove(i);
}
return list.get(0);
}