约瑟夫环问题
描述
N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。
示例
输入
5,3 //n为人数,m为被杀掉的报数
返回值
3
题解1
模拟环
public int LastRemaining_Solution(int n, int m) {
if (n == 0) return -1;
ArrayList<Integer> list = new ArrayList<>();
for(int i = 0; i < n; i++)
list.add(i);
int cur = -1;
while (n-- > 1) {
for(int i = 0;i<m;i++){
cur++;
if(cur == list.size()){
cur = 0;
}
}
list.remove(cur);
cur--;//新的list中cur指向了下一个元素,所以cur向前移动一位。
}
return list.get(0);
}
题解2
数学求余
public int LastRemaining_Solution(int n, int m) {
if (n == 0) return -1;
ArrayList<Integer> list = new ArrayList<>();
for(int i = 0; i < n; i++)
list.add(i);
int cur = -1;
while (n-- > 1) {
cur = (cur + m) % list.size();//
list.remove(cur--);
}
return list.get(0);
}