把所有经常写到的连续力扣罗列在这,对这种看上去比较复杂的题目总结一个普适性强的解法
LeetCode 603 连续空余座位
查找电影院所有连续可用座位,返回值按seat_id 升序排列
思路:
WITH cinema_valid_seat AS(
SELECT
seat_id,
seat_id + 1 AS next_num,-- 5的下一个数值是6
seat_id - 1 AS former_num,-- 5的上一个数值是4
LEAD(seat_id) OVER (ORDER BY seat_id ASC) AS next_lead,-- 5的下一行有效座位是6
LAG(seat_id) OVER (ORDER BY seat_id ASC) AS former_lag -- 5的上一行有效座位是3
FROM Cinema
WHERE free = 1 -- 过滤所有的有效座位
)-- 把物理的上一个下一个 和表内的下一个上一个 全抓出来!!(适用于以1为单位为gap的数据)
-- 4,5,3,5,2
-- 5,6,4,6,4
-- 6,7,5,8,5
-- 8,9,7,9,6
SELECT seat_id
FROM cinema_valid_seat
WHERE next_num = next_lead -- 物理下一个 = 表内下一行 例如5,8 这种向下连续的数
OR -- 或(满足任意一个即可,5 是上下都连续,如果改成AND 就会变成 上下都连续的作为最终结果集)
former_num = former_lag -- 物理上一个 = 表内上一行 例如6 这种向上连续的数
ORDER BY seat_id ASC -- 升序排列
;
Leetcode XX
Answer