面试题62(剑指offer)--圆圈中最后剩下的数字

2019-08-15  本文已影响0人  Tiramisu_b630

题目:

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

解法:

    /**
     * 约瑟夫环问题:
     * 长度为n的解可以看作长度为n-1的解加上m之后对n取余
     * 即f(n,m)=(f(n-1,m)+m)%n,
     * f(n-1,m)=(f(n-2,m)+m)%(n-1)
     * @param n
     * @param m
     * @return
     */
    public static int lastRemaining_Solution(int n, int m) {
        if(n<1||m<1){
            return -1;
        }
        int temp=0;
        for (int i = 2; i <=n ; i++) {
            temp=(temp+m)%i;
        }
        return temp;
    }

解释:

则映射函数为g(x)=(x-k-1)%n,其逆映射为g`(x)=(x+k+1)%n。

映射前 映射后
p((n-1),m) f((n-1),m)
x g(x)=(x+k+1)%n
上一篇 下一篇

猜你喜欢

热点阅读