通配连续性题目解法小结

把所有经常写到的连续力扣罗列在这,对这种看上去比较复杂的题目总结一个普适性强的解法

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


posted @ 2024-07-28 16:45  hirayuriovo  阅读(39)  评论(0)    收藏  举报