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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/yuan-quan-zhong-zui-hou-sheng-xia-de-shu-zi-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution:
def lastRemaining(self, n: int, m: int) -> int:
# 这个是著名的约瑟夫问题
# f(n,m) 表示有n个元素,每隔m个元素进行环形删除后最后剩下的那个元素的索引号
# n = 1时候,f(n,m) = 0,
# n > 1时候,f(n,m) = (f(n - 1,m) + m)/n
# 最终或下来那个人的初始位置
pos = 0
# i 为第n轮中的n值,最后一轮也就是第一轮,我们从后往前推,那么第二轮则i从2,开始最后到n
for i in range(2,n + 1):
pos = (pos + m)%i
return int(pos)