链接:剑指 Offer 62. 圆圈中最后剩下的数字
比较好理解的方法:
class Solution {public int lastRemaining(int n, int m) {List<Integer> list=new ArrayList<>();for(int i=0;i<n;i++){list.add(i);}int index=0;while(n>1){index=(index+m-1)%n;list.remove(index);n--;}return list.get(0);}}
有一个数学方法:
约瑟夫环——公式法(递推公式)
可以推导得到公式
f(1)=0
f(2)=(f(1)+m)%2=1
f(3)=(f(2)+m)%3=1
f(4)=(f(3)+m)%4=0
f(5)=(f(4)+m)%5=3
每次去掉哪一个,相当于把数组中所有数字往前移动m位删掉最后一个
所以最后活下来的那个数字,每一轮都在被往前移动m位
因为最后只剩它一个的时候,index=0
倒推得到最开始的下标
class Solution {public int lastRemaining(int n, int m) {int index=0;for(int i=2;i<=n;i++){index=(index+m)%i;}return index;}}
