python【力扣LeetCode算法题库】面试题62- 圆圈中最后剩下的数字(约瑟夫环)

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

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

示例 1:

输入: n = 5, m = 3
输出: 3
示例 2:

输入: n = 10, m = 17
输出: 2

限制:

1 <= n <= 10^5
1 <= m <= 10^6
由题目可知,每次删除一个元素之后,我们需要从下一个元素重新编号,并且我们的编号是成环的。 由“成环”这句话,我想到了使用模运算。
约瑟夫环是一个经典的数学问题,我们不难发现这样的依次报数,似乎有规律可循。为了方便导出递推式,我们重新定义一下题目。
问题: N个人编号为1,2,……,N,依次报数,每报到M时,杀掉那个人,求最后胜利者的编号。

这边我们先把结论抛出了。之后带领大家一步一步的理解这个公式是什么来的。
在这里插入图片描述
在这里插入图片描述
上面解析下标从0开始,本题返回从0开始的序号,所以等同于下标。

class Solution(object):
    def lastRemaining(self, n, m):
        """
        :type n: int
        :type m: int
        :rtype: int
        """
        i=1
        ans = 0
        while i<=n:
            ans = (ans+m)%i
            i+=1
        return ans

在这里插入图片描述

发布了915 篇原创文章 · 获赞 250 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/weixin_43838785/article/details/105191163