Time Needed to Buy Tickets

 There are n people in a line queuing to buy tickets, where the 0th person is at the front of the line and the (n - 1)th person is at the back of the line.


You are given a 0-indexed integer array tickets of length n where the number of tickets that the ith person would like to buy is tickets[i].


Each person takes exactly 1 second to buy a ticket. A person can only buy 1 ticket at a time and has to go back to the end of the line (which happens instantaneously) in order to buy more tickets. If a person does not have any tickets left to buy, the person will leave the line.


Return the time taken for the person initially at position k (0-indexed) to finish buying tickets.


 


Example 1:


Input: tickets = [2,3,2], k = 2


Output: 6


Explanation:


The queue starts as [2,3,2], where the kth person is underlined.

After the person at the front has bought a ticket, the queue becomes [3,2,1] at 1 second.

Continuing this process, the queue becomes [2,1,2] at 2 seconds.

Continuing this process, the queue becomes [1,2,1] at 3 seconds.

Continuing this process, the queue becomes [2,1] at 4 seconds. Note: the person at the front left the queue.

Continuing this process, the queue becomes [1,1] at 5 seconds.

Continuing this process, the queue becomes [1] at 6 seconds. The kth person has bought all their tickets, so return 6.

Example 2:


Input: tickets = [5,1,1,1], k = 0


Output: 8


Explanation:


The queue starts as [5,1,1,1], where the kth person is underlined.

After the person at the front has bought a ticket, the queue becomes [1,1,1,4] at 1 second.

Continuing this process for 3 seconds, the queue becomes [4] at 4 seconds.

Continuing this process for 4 seconds, the queue becomes [] at 8 seconds. The kth person has bought all their tickets, so return 8.

 

    Summary of Logic:

  • Put all people in a queue (we use their index).

  • Keep letting the front person buy 1 ticket at a time.

  • Count time for each ticket bought.

  • Re-insert person to queue if they still need tickets.

  • Stop when person at index k has 0 tickets left.

🧠 Simple Explanation:

  • We keep going person by person.

  • Every time someone buys a ticket, it takes 1 second.

  • If that person still needs tickets, they go to the back.

  • Stop when the person at position k has 0 tickets left.

     Dry Run (tickets = [2,3,2], k = 2)

    Queue: [0,1,2]

    • 0 → buys → [1,1,2] → back

    • 1 → buys → [1,2,2] → back

    • 2 → buys → [1,2,1] → back

    • 0 → buys → [0,2,1]

    • 1 → buys → [0,1,1] → back

    • 2 → buys → [0,1,0] → done 

    Time = 6


class Solution {
    public int timeRequiredToBuy(int[] tickets, int k) {

        // Create a queue to store the indices of people in line
        Queue<Integer> que = new LinkedList<>();
        int n = tickets.length;

        // Add all people (indices from 0 to n-1) to the queue
        for (int i = 0; i < n; i++) {
            que.offer(i);
        }

        int time = 0;

        // Run the loop until the person at position 'k' has no tickets left
        while (tickets[k] > 0) {
            // Get the person at the front of the queue
            int front = que.poll();

            // If the person still has tickets left
            if (tickets[front] > 0) {
                tickets[front]--; // They buy 1 ticket
                time++; // Time increases by 1 second

                // If they still need more tickets, go back to the end of the queue
                if (tickets[front] > 0) {
                    que.offer(front);
                }
            }
        }

        // Return total time taken for person at index 'k' to buy all tickets
        return time;
    }
}

Comments

Popular posts from this blog

Two Sum II - Input Array Is Sorted

Comparable Vs. Comparator in Java

Increasing Triplet Subsequence