美文网首页
62-约瑟夫环

62-约瑟夫环

作者: 一方乌鸦 | 来源:发表于2020-05-07 09:38 被阅读0次

    精彩的讲解:
    https://www.cnblogs.com/qilinart/articles/4555825.html
    https://blog.csdn.net/u011500062/article/details/72855826

    原题

    0,1...n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。

    1. 使用模拟链表

    public class Solution {
        public int lastRemaining(int n, int m) {
            if (n == 1) return 0;
            if (m == 0) return n - 1;
            ArrayList<Integer> list = new ArrayList<>(n);
            for (int i = 0;  i < n; i++) list.add(i);
            int index = 0;
            int size = n;
            while(size > 1) {
                index = (index + m - 1) % size;
                list.remove(index);
                size--;
            }
            return list.get(0);
        }
    }
    

    2. 使用数学解法

    递推公式:f(N,M)=(f(N−1,M)+M)%N
    这个公式描述的是:幸存者在这一轮的下标位置
    f(N,M)表示,N个人报数,每报到M时杀掉那个人,最终胜利者的编号
    f(N−1,M)表示,N-1个人报数,每报到M时杀掉那个人,最终胜利者的编号

    class Solution {
        public int lastRemaining(int n, int m) {
            int res = 0;
            for (int i = 2; i <= n; i++) {
                res = (res + m) % i;
            }
            return res;
        }
    }
    

    相关文章

      网友评论

          本文标题:62-约瑟夫环

          本文链接:https://www.haomeiwen.com/subject/jxphwhtx.html