Welcome to Subscribe On Youtube

3140. Consecutive Available Seats II 🔒

Description

Table: Cinema

+-++
\| Column Name \| Type \|
+-++
\| seat_id     \| int  \|
\| free        \| bool \|
+-++
seat_id is an auto-increment column for this table.
Each row of this table indicates whether the ith seat is free or not. 1 means free while 0 means occupied.

Write a solution to find the length of longest consecutive sequence of available seats in the cinema.

Note:

  • There will always be at most one longest consecutive sequence.
  • If there are multiple consecutive sequences with the same length, include all of them in the output.

Return the result table ordered by first_seat_id in ascending order.

The result format is in the following example.

 

Example:

Input:

Cinema table:

+++
\| 1       \| 1    \|
\| 2       \| 0    \|
\| 3       \| 1    \|
\| 4       \| 1    \|
\| 5       \| 1    \|
+--+--+
\| first_seat_id   \| last_seat_id   \| consecutive_seats_len \|
+-+--+--+

Explanation:

  • Longest consecutive sequence of available seats starts from seat 3 and ends at seat 5 with a length of 3.
Output table is ordered by first_seat_id in ascending order.

Solutions

Solution 1: Using Window Function

First, we find all the vacant seats, and then group the seats. The grouping is based on the seat number minus its ranking. In this way, consecutive vacant seats will be grouped together. Then we find the minimum seat number, maximum seat number, and length of consecutive seats in each group. Finally, we find the group with the longest length of consecutive seats, and output the minimum seat number, maximum seat number, and length of consecutive seats in this group.

  • # Write your MySQL query statement below
    WITH
        T AS (
            SELECT
                *,
                seat_id - (RANK() OVER (ORDER BY seat_id)) AS gid
            FROM Cinema
            WHERE free = 1
        ),
        P AS (
            SELECT
                MIN(seat_id) AS first_seat_id,
                MAX(seat_id) AS last_seat_id,
                COUNT(1) AS consecutive_seats_len,
                RANK() OVER (ORDER BY COUNT(1) DESC) AS rk
            FROM T
            GROUP BY gid
        )
    SELECT first_seat_id, last_seat_id, consecutive_seats_len
    FROM P
    WHERE rk = 1
    ORDER BY 1;
    
    

All Problems

All Solutions