引入热土豆问题:
热土豆问题——“击鼓传花”的土豆版本
传烫手的热土豆,鼓声停的时候,手里有土豆的小孩要出列
解决思路:
- 用队列来实现热土豆问题的算法,参加游戏的人名列表,以及传土豆次数num,算法返回最后剩下的人名
- 模拟程序采用队列来存放所有参加游戏的人名,按照传递土豆方向从队首排到队尾
注:游戏时,队首始终是持有土豆的人 - 模拟游戏开始,只需要将队首的人出队,随即再到队尾入队,算是土豆的一次传递
传递num次后,将队首的人移除,不再入队如此反复,直到队列中剩余一人
题目:
0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。
例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。
leetcode原题链接
分析:
可以看出,这题是热土豆问题的变式,带入热土豆问题的解决思路,模拟这个过程,代码如下
from collections import deque
class Solution:
def lastRemaining(self, n: int, m: int) -> int:
record=deque()
for i in range(n):
record.append(i)#这三行优化为:record=deque(range(n))
while len(record)>1:
for i in range(m-1):
record.append(record.popleft())
record.popleft()
return record.pop()
但leetcode提交时,会超时:
最后采用题解的思路,成功通过
class Solution:
def lastRemaining(self, n: int, m: int) -> int:
i=0
record=list(range(n))
while len(record)>1:
i=(i+m-1)%len(record)
record.pop(i)
return record[0]