约瑟夫问题(约瑟夫环) java
程序员文章站
2024-03-16 22:17:40
...
n个人围成一圈,编号为0~n-1,从第0号开始,数到m-1,则去掉编号为m-1的人,然后按下一个人为0开始重新计数,直到最后只剩下一个人。
初始状态为0,1,2,......,m-2,m-1,m,m+1,......,n-2,n-1
当去掉m-1后状态为0,1,2,......,m-2,m,m+1,......,n-2,n-1
将剩下的n-2个人重新编号
m --------> 0
m+1 --------> 1
......
m-2 --------> n-2
设f(n)为求出n人中剩下的人的算法,f(1) = 0;
当一共n个人的时候,求出的人的编号为x,f(n) = x;
当一共n-1个人的时候,求出的人的编号为x',f(n-1) = x';
有规律:(x' + m)%n = x
即f(n) = (f(n-1) + m)%n
public class Solution {
public int LastRemaining_Solution(int n, int m) {
if(n < 1||m < 1)
return -1;
if(n == 1)
return 0;
return (LastRemaining_Solution(n-1,m)+m)%n;
}
}