leetcode 面试题62. 圆圈中最后剩下的数字(约瑟夫环)

题目描述:

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

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

题解:

  剑指offer上也刷到过简单记录一下。

  定义f(n,m)为0,1...n-1这n个数字排一圈每次删除第m个数字之后剩下的数字。在删除第m个数字之后,剩下了n-1个数字,我们对其重新编号为0,1,...n-2。如下所示:

  原始   0   1   2   3   4   5   6   7   8   9

  旧环   0   1   2        4   5   6   7   8   9

  新环   6   7   8        0   1   2   3   4   5

  假设f(n,m)(旧环)对应的编号为x1,f(n-1,m)(新环)重新编号之后的编号为x2,x1 = (x2+m%n)%n,也就是说 f(n,m) = (f(n-1,m)+m%n)%n。当n==1的时候,无论m

等于多少,因为只有0这一个元素,return 0就好了。递归求解就好了。

 

AC代码:

  

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

 

posted @ 2020-03-30 10:13  猪突猛进!!!  阅读(175)  评论(0编辑  收藏  举报