2073 Time Needed To Buy Tickets
Published:
Problem
Solution
Intuition
This problem requires us to find the total amount of time requried for person k
to buy all of their tickets.
To solve this problem, we can simply consider logically what is occurring when person k
finally buys all of their tickets. Everyone in front of them will have bought either tickets[k]
or tickets[i]
whichever is less as they will either buy all of their needed tickets and leave, or continue staying in line after person k
leaves which is when our simulation ends. Everyone behind person k
will buy tickets[i]
or tickets[k] - 1
whichever is less because they will get one less turn than person k
who goes first and will buy either one less than person k
when they leave, or buy all of their tickets and leave the simulation.
This creates a mathematical approach to solving this problem without actually needing to run the simulation of ticket purchases.
Approach
- Account for all of person
k
’s tickets as this is when the simulation ends and initialize our result,res
, totickets[k]
- For every person in front of
k
, they will buy either all of their ticket needs, or as many as personk
needs prior to the simulation end which ever is less. Addmin(tickets[i], tickets[k])
to our result. - For every person behind
k
, they will buy either all of their ticket needs, or one less thank
’s needs ask
will have bought 1 ticket prior to their turn, whichever is less. Addmin(tickets[i], tickets[k] - 1)
to our result. - Return our result.
Complexity
- Time complexity: $O(n)$. We iterate through the entire list and perform constant time operations on each iteration.
- Space complexity: $O(1)$. We utilize constant space for our variables.
Code
class Solution:
def timeRequiredToBuy(self, tickets: List[int], k: int) -> int:
res = tickets[k]
for i in range(k):
res += min(tickets[i], tickets[k])
for i in range(k+1, len(tickets)):
res += min(tickets[i], tickets[k] - 1)
return res