题解
思路
- 约瑟夫问题的数学递推公式:
代码
class Solution(object):
### 0908 递归(384 ms,108.4 MB)
def lastRemaining(self, n, m):
"""
:type n: int
:type m: int
:rtype: int
"""
def ysf(n, m):
## 当圈中只有1个元素时,则此元素为待求的元素,返回其在当前圈(数组)中的下标0
## 用于需要利用n-1,所以这里的判断条件为:n==0
if n == 0:
return 0
## 递归计算n-1个元素中,返回的下标ysf_1为多少(用于反向推导回元素个数为n的情况)
ysf_1 = ysf(n-1, m)
## 利用子问题的下标,加上间隔个数m,来还原倒推当前问题的下标(需对当前数组规模n求余)
return (ysf_1 + m) % n
# 返回的是待求元素的下标(从0开始)!
return ysf(n, m)
### 0908 递推(64 ms,15.8 MB)
def lastRemaining(self, n, m):
# 当圈中只有0或1个元素时
if n == 0: return -1
if n == 1: return 0
## 当圈中有多余1个元素时,则此元素为待求的元素,返回其在当前圈(数组)中的下标0
ysf = 0
## 利用子问题的下标,加上间隔个数m,来还原倒推当前问题的下标(需对当前数组规模i求余)
## 问题规模从2个元素到n个元素
for i in range(2, n+1):
ysf = (ysf + m) % i
# 返回的是待求元素的下标(从0开始)!
return ysf