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 # 理论上不会触发
对于简单题来说,它的题干内容是非常多的.我们只需要直到,一个人一次只能买一张,如果没有买完就得回到队尾,所以这个队列如果能存储位置以及剩余要买的票的话,这个问题就能很好的解答了

被折叠的 条评论
为什么被折叠?



