import java.util.List; import java.util.ArrayList; publicclassSolution { publicintLastRemaining_Solution(int n, int m) { if(n<=0 || m<1){ return -1; } List<Integer> kids = newArrayList<>(); for(int i=0;i<n;i++) kids.add(i); intindex=0; while(kids.size() > 1){ index = (index+m-1)% kids.size(); kids.remove(index); // 移动走的位置会重新填入 } return kids.get(0); } }
解法二:递推公式
时间复杂度O(n)
最后剩一个人,索引为0
两个人时,幸运者编号是 f(2,m) =(0+m)%2
f(n,m) = (f(n-1,m) + m) % n
1 2 3 4 5 6 7 8 9 10 11 12
publicclassSolution { publicintLastRemaining_Solution(int n, int m) { if(n<1 || m < 1){ return -1; } intlast=0; for(int i=2;i<=n;i++){ last = (last + m) % i; } return last; } }