圆圈中最后剩下的数字

要求: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、可以递推到一个公式:
f(n, m)=\left\{\begin{array}{ll}0 & n=1 \\ {[f(n-1, m)+m] \% n} & n>1\end{array}\right.

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;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容