美文网首页
剑指offer 62 约瑟夫问题

剑指offer 62 约瑟夫问题

作者: 再凌 | 来源:发表于2020-05-07 13:57 被阅读0次

    n个人, 每m个数就杀掉一个人

    其实这是一个数学问题.

    我们只关注活着的那个人(我们称之为幸运儿)的序号变化:

    image.png

    正这不好看我们从下往上看. 如下图, 从N = 7 反推N = 8

    image.png

    我们可以得到, 索引(也称为活着的人数)为N时, 幸运儿的位置, 是索引N-1时的位置 + m, (此时数组长度溢出, 因此要余索引N),得到N时幸运儿的位置.

    最后一次我们知道幸运儿位置一定是0, 且这次的索引是1, 因此我们从索引2开始一直推到索引N, 也就是所有人的总数n, 取此时的位置变量, 就是最终结果.

    代码很简单

    int lastRemaining(int n, int m){
        int pos = 0;
        for(int i = 2; i<=n; i++)
        {
            pos = (pos + m) % i;
        }
        return pos;
    }
    

    相关文章

      网友评论

          本文标题:剑指offer 62 约瑟夫问题

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