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 ); 上期推文:
经验分享 程序员 微信小程序 职场和发展