题目描述
0, 1, …, n-1这n个数字(n>0)排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字。
求出这个圆圈里剩下的最后一个数字。
样例:
输入:n=5 , m=3
输出:3
解题思路
题目是经典的约瑟夫(Josephuse)环问题。
模拟圆圈
用一个数组去模拟圆圈,然后每次在数组中删除第m个元素。
时间复杂度为O(n)O(n)O(n),空间复杂度为O(n)O(n)O(n).
class Solution(object):
def lastRemaining(self, n, m):
"""
:type n: int
:type m: int
:rtype: int
"""
if n < 1 or m < 1: return -1
nums = list(range(n))
while len(nums) > 1:
if m % len(nums):
index = m % len(nums) - 1
else:
index = len(nums)-1
nums = nums[index + 1:] + nums[:index]
return nums[0]
递推关系式
定义一个关于n和m的方程f(n,m)f(n,m)