Day19 圆圈中最后剩下的数字

引入热土豆问题:

热土豆问题——“击鼓传花”的土豆版本
传烫手的热土豆,鼓声停的时候,手里有土豆的小孩要出列

解决思路

  • 用队列来实现热土豆问题的算法,参加游戏的人名列表,以及传土豆次数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]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值