题目
0, 1,…, n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈剩下的最后一个数字。
思路
- 模拟转圈的过程,计数并弹出数字,最后剩下一个数的时候就输出。
- 时间复杂度:O(n^2)
- 空间复杂度:O(n)
- 通过数学解得递推公式,从n=0,逐步求得n=n。
- 时间复杂度:O(n)
- 空间复杂度:O(1)
代码
思路1:时间复杂度:O(n^2),空间复杂度:O(n)
def last_number_in_circle(n, m):
"""
:param n: max number
:param m:count m then pop
:return: last number
"""
nums = list(range(n))
count = 1
i = 0
while len(nums) > 1:
if count == m:
nums.pop(i)
count = 1
i -= 1
else:
count += 1
i = i + 1 if i < len(nums) - 1 else 0
return nums[0]
思路2:时间复杂度:O(n),空间复杂度:O(1)
def last_number_in_circle_2(n, m):
"""
:param n: max number
:param m:count m then pop
:return: last number
"""
if n < 1 or m < 1:
return -1
last = 0
for i in range(2, n + 1):
last = (last + m) % i
return last