leetcode 2073.买票需要的时间

2073.买票需要的时间
有 n 个人前来排队买票,其中第 0 人站在队伍 最前方 ,第 (n - 1) 人站在队伍 最后方 。

给你一个下标从 0 开始的整数数组 tickets ,数组长度为 n ,其中第 i 人想要购买的票数为 tickets[i] 。

每个人买票都需要用掉 恰好 1 秒 。一个人 一次只能买一张票 ,如果需要购买更多票,他必须走到 队尾 重新排队(瞬间 发生,不计时间)。如果一个人没有剩下需要买的票,那他将会 离开 队伍。

返回位于位置 k(下标从 0 开始)的人完成买票需要的时间(以秒为单位)。

示例 1:

输入:tickets = [2,3,2], k = 2

输出:6

解释:

队伍一开始为 [2,3,2],第 k 个人以下划线标识。
在最前面的人买完票后,队伍在第 1 秒变成 [3,2,1]。
继续这个过程,队伍在第 2 秒变为[2,1,2]。
继续这个过程,队伍在第 3 秒变为[1,2,1]。
继续这个过程,队伍在第 4 秒变为[2,1]。
继续这个过程,队伍在第 5 秒变为[1,1]。
继续这个过程,队伍在第 6 秒变为[1]。第 k 个人完成买票,所以返回 6。
一个经典的买票问题,题目内容比较多,我们解题的时候第一反应当然应该是用什么数据结构来解决.
答案是队列,队列对这种排列问题来说就是基础的解决方案,队列的基本api是popleft和append,解答如下

class Solution:
    def timeRequiredToBuy(self, tickets: List[int], k: int) -> int:
        q = deque()
        n = len(tickets)
        # 初始化队列:每个元素是 (位置, 剩余票数)
        for i in range(n):
            q.append((i, tickets[i]))
        
        time = 0
        while q:
            # 队首的人买1张票
            idx, cnt = q.popleft()
            time += 1  # 买1张票耗时1秒
            cnt -= 1   # 剩余票数减1
            
            # 如果是目标位置k且票已买完,直接返回时间
            if idx == k and cnt == 0:
                return time
            
            # 如果还有剩余票数,回到队尾
            if cnt > 0:
                q.append((idx, cnt))
        
        return time  # 理论上不会触发

对于简单题来说,它的题干内容是非常多的.我们只需要直到,一个人一次只能买一张,如果没有买完就得回到队尾,所以这个队列如果能存储位置以及剩余要买的票的话,这个问题就能很好的解答了

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白云千载尽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值