LeetCode刷题实战603:连续空余座位
今天和大家聊的问题叫做 连续空余座位,我们先来看题面:
https://leetcode.cn/problems/consecutive-available-seats/
解题
1、join
思路:只有一张表,需要通过seat_id自己连自己,条件是abs(c1.seat_id - c2.seat_id) = 1。
代码:
select distinct c1.seat_id from cinema c1 join cinema c2 on abs(c1.seat_id - c2.seat_id) = 1 and c1.free = 1 and c2.free = 1 order by c1.seat_id;
2、row_number() over()
思路:
S1:使用窗口函数 row_number 对 cinema 进行排序,seat_id - row_number() over() as k ,如果座位连续,这组 k 值应该是相等的。
S2:将第一步和第二步的结果作为临时表 temp,将临时表 temp 按照 k 进行分组查询,并且筛选出大于 2 的 k 值
S3:从临时表 temp 中查询出 seat_id ,筛选出 k 值在第四步中的值
代码:
with temp as ( select seat_id, seat_id - row_number() over() as k from cinema where free = 1 ) select seat_id from temp where k in ( select k from temp group by k having count(*) >= 2 );
上期推文:
今天和大家聊的问题叫做 连续空余座位,我们先来看题面: https://leetcode.cn/problems/consecutive-available-seats/ 解题 1、join 思路:只有一张表,需要通过seat_id自己连自己,条件是abs(c1.seat_id - c2.seat_id) = 1。 代码: select distinct c1.seat_id from cinema c1 join cinema c2 on abs(c1.seat_id - c2.seat_id) = 1 and c1.free = 1 and c2.free = 1 order by c1.seat_id; 2、row_number() over() 思路: S1:使用窗口函数 row_number 对 cinema 进行排序,seat_id - row_number() over() as k ,如果座位连续,这组 k 值应该是相等的。 S2:将第一步和第二步的结果作为临时表 temp,将临时表 temp 按照 k 进行分组查询,并且筛选出大于 2 的 k 值 S3:从临时表 temp 中查询出 seat_id ,筛选出 k 值在第四步中的值 代码: with temp as ( select seat_id, seat_id - row_number() over() as k from cinema where free = 1 ) select seat_id from temp where k in ( select k from temp group by k having count(*) >= 2 ); 上期推文: