Time Needed To Buy Tickets

Problem Summary

Key Observations

Approach Taken

Main Concepts Used

Code (Simulation)

class Solution:
    def timeRequiredToBuy(self, tickets: List[int], k: int) -> int:
        queue = deque()
        for index, ticketsNeeded in enumerate(tickets):
            queue.append((ticketsNeeded, index == k))

        time = 0
        while True:
            time += 1
            ticketRequired, isTracked = queue.popleft()

            if ticketRequired == 1 and isTracked:
                # the tracked person will buy their last ticket and get out of the queue
                return time
            elif ticketRequired != 1:
                queue.append((ticketRequired - 1, isTracked))

Time & Space Complexity

Code (Simulation - Improved)

Code (Optimal)

class Solution:
    def timeRequiredToBuy(self, tickets: List[int], k: int) -> int:
        result = 0
        for index, ticket in enumerate(tickets):
            if index <= k:
                # process people front of the person
                result += min(tickets[k], ticket)
            else:
                # process people after the person
                result += min(tickets[k] - 1, ticket)
        return result

Time & Space Complexity