题目描述:0,1,,,,,n-1这n 个数字排成一个圆圈,从数字0开始每次从这个圆圈中删除第m个数字。求出这个圆圈里剩下的最后一个数字.
经典解法:用环形链表模拟圆圈
public void lastRemaining(int totalNum,int index){
List<Integer> list = new ArrayList<Integer>();
for(int i=0;i<totalNum;i++)
list.add(i);
//从第k个开始计数,计数和实际链表的位置中间差1
int k=0;
while (list.size()>1){
k = k + index;
//每次的第m个人的位置
k = k%(list.size())-1;
//判断是否到达末尾
if(k<0){
//System.out.println(list.get(list.size()-1));
list.remove(list.size()-1);//最后
k = 0;//将迭代器移到头部,相当于按照顺序循环圆圈遍历
}else {
//System.out.println(list.get(k));
list.remove(k);
}
}
//System.out.println(list.get(k));
}
每次删除一个数字需要m步运算,总共n个数字,时间复杂度为O(m*n)
辅助链表来模拟圆圈,空间复杂度为O(n)
创新的解法:
public int lastRemaining(int n,int m){
if(n<1||m<1) return -1;
int last = 0;
for(int i=2;i<=n;i++){
last = (last+m)%i;
}
return last;
}