题解 | #孩子们的游戏(圆圈中最后剩下的数)#

孩子们的游戏(圆圈中最后剩下的数)

http://www.nowcoder.com/practice/f78a359491e64a50bce2d89cff857eb6

这个问题就是约瑟夫环问题。
显然这个可以用链表实现,除了链表之外,可以观察其规律。
n个人,需要报的数为m,那么被挑出的人就是(m-1)%n,下一个开始的人就是m%n,这是圆圈还有n-1个人。我们可以发现这不就是n-1个人,需要报的数为m的版本吗。所以我们需要看一看两者编号之间有无规律,m%n为开始,在n-1中为0,再考虑环,我们不妨试一下(0+m%n)%n可不可以复原,发现是可以的,ok,规律找到了。那么我们把大问题拆分,到最后为n=1的情况,即最后存活的人,用递归来做。

class Solution {
public:
    int LastRemaining_Solution(int n, int m) {
        if(n == 0) return -1;
        if(n == 1) return 0;
        int k = m%n;
        return (LastRemaining_Solution(n-1, m) + k)%n;
    }
};

另外补充一个非递归的版本吧。

class Solution {
public:
    int LastRemaining_Solution(int n, int m) {
        if(n == 0) return -1;
        int number = 0;
        for(int i=1;i<n;i++){
            number += m%(i+1);
            number %= i+1;
        }
        return number;
    }
};
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务