圆圈中最后剩下的数字

要求:0,1,,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。
例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。

思路: 参考
这个问题实际上是约瑟夫问题,这个问题描述是:N个人围成一圈,第一个人从1开始报数,报M的将被杀掉,下一个人接着从1开始报。如此反复,最后剩下一个,求最后的胜利者。
1、问题转换:F(n,m)表示有n个元素,没隔m个元素进行环形删除后最后剩下那个元素的索引号。
2、可以递推到一个公式:

class Solution {
    public int lastRemaining(int n, int m) {
        // return recur(n,m);  使用递归
        // 方法一:不使用递归
        int pos = 0;
        for(int i = 2; i<=n; i++){
            pos = (pos+m)%i;
        }
        return pos;
    }

    // 方法二:递归
    public int recur(int n , int m){
        if(n==1)return 0;
        int x = recur(n-1,m);
        return (x+m) % n;
    }
}

你可能感兴趣的:(圆圈中最后剩下的数字)