【剑指offer】面试题62. 圆圈中最后剩下的数字

Description

来源:力扣(LeetCode)

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

Solutions

参考约瑟夫环——公式法(递推公式)

约瑟夫问题

约瑟夫问题是个著名的问题:N个人围成一圈,第一个人从1开始报数,报M的将被杀掉,下一个人接着从1开始报。如此反复,最后剩下一个,求最后的胜利者。
例如只有三个人,把他们叫做A、B、C,他们围成一圈,从A开始报数,假设报2的人被杀掉。

  • 首先A开始报数,他报1。侥幸逃过一劫。
  • 然后轮到B报数,他报2。非常惨,他被杀了
  • C接着从1开始报数
  • 接着轮到A报数,他报2。也被杀死了。
  • 最终胜利者是C

公式法

约瑟夫环是一个经典的数学问题。

问题: N个人编号为1,2,……,N,依次报数,每报到M时,杀掉那个人,求最后胜利者的编号。

递推公式

  • 表示,N个人报数,每报到M时杀掉那个人,最终胜利者的编号
  • 表示,N-1个人报数,每报到M时杀掉那个人,最终胜利者的编号
class Solution:
    def lastRemaining(self, n: int, m: int) -> int:
        p=0
        for i in range(2, n+1):
            p=(p+m)%i
        return p

你可能感兴趣的:(【剑指offer】面试题62. 圆圈中最后剩下的数字)