返回介绍

solution / 0600-0699 / 0603.Consecutive Available Seats / README

发布于 2024-06-17 01:03:36 字数 2372 浏览 0 评论 0 收藏 0

603. 连续空余座位

English Version

题目描述

表: Cinema

+-------------+------+
| Column Name | Type |
+-------------+------+
| seat_id   | int  |
| free    | bool |
+-------------+------+
Seat_id 是该表的自动递增主键列。
在 PostgreSQL 中,free 存储为整数。请使用 ::boolean 将其转换为布尔格式。
该表的每一行表示第 i 个座位是否空闲。1 表示空闲,0 表示被占用。

 

查找电影院所有连续可用的座位。

返回按 seat_id 升序排序 的结果表。

测试用例的生成使得两个以上的座位连续可用。

结果表格式如下所示。

 

示例 1:

输入: 
Cinema 表:
+---------+------+
| seat_id | free |
+---------+------+
| 1     | 1  |
| 2     | 0  |
| 3     | 1  |
| 4     | 1  |
| 5     | 1  |
+---------+------+
输出: 
+---------+
| seat_id |
+---------+
| 3     |
| 4     |
| 5     |
+---------+

解法

方法一:自连接

我们可以使用自连接的方式,将相邻的两个座位连接起来,然后筛选出连续空余的座位并去重排序即可。

# Write your MySQL query statement below
SELECT DISTINCT a.seat_id
FROM
  Cinema AS a
  JOIN Cinema AS b ON ABS(a.seat_id - b.seat_id) = 1 AND a.free AND b.free
ORDER BY 1;

方法二:窗口函数

我们也可以使用 LAGLEAD 函数(或者 SUM() OVER(ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING))来获取相邻的座位信息,然后筛选出连续空余的座位并去重排序即可。

# Write your MySQL query statement below
WITH
  T AS (
    SELECT
      seat_id,
      (free + (LAG(free) OVER (ORDER BY seat_id))) AS a,
      (free + (LEAD(free) OVER (ORDER BY seat_id))) AS b
    FROM Cinema
  )
SELECT seat_id
FROM T
WHERE a = 2 OR b = 2;

方法三

# Write your MySQL query statement below
WITH
  T AS (
    SELECT
      *,
      SUM(free = 1) OVER (
        ORDER BY seat_id
        ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
      ) AS cnt
    FROM Cinema
  )
SELECT seat_id
FROM T
WHERE free = 1 AND cnt > 1
ORDER BY 1;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文