# Write your MySQL query statement below
2494. 合并在同一个大厅重叠的活动
表: HallEvents
+-------------+------+ | Column Name | Type | +-------------+------+ | hall_id | int | | start_day | date | | end_day | date | +-------------+------+ 该表可能包含重复字段。 该表的每一行表示活动的开始日期和结束日期,以及活动举行的大厅。
编写解决方案,合并在 同一个大厅举行 的所有重叠活动。如果两个活动 至少有一天 相同,那么它们就是重叠的。
以任意顺序返回结果表。
结果格式如下所示。
示例 1:
输入: HallEvents 表: +---------+------------+------------+ | hall_id | start_day | end_day | +---------+------------+------------+ | 1 | 2023-01-13 | 2023-01-14 | | 1 | 2023-01-14 | 2023-01-17 | | 1 | 2023-01-18 | 2023-01-25 | | 2 | 2022-12-09 | 2022-12-23 | | 2 | 2022-12-13 | 2022-12-17 | | 3 | 2022-12-01 | 2023-01-30 | +---------+------------+------------+ 输出: +---------+------------+------------+ | hall_id | start_day | end_day | +---------+------------+------------+ | 1 | 2023-01-13 | 2023-01-17 | | 1 | 2023-01-18 | 2023-01-25 | | 2 | 2022-12-09 | 2022-12-23 | | 3 | 2022-12-01 | 2023-01-30 | +---------+------------+------------+ 解释: 有三个大厅。 大厅 1: - 两个活动 ["2023-01-13", "2023-01-14"] 和 ["2023-01-14", "2023-01-17"] 重叠。我们将它们合并到一个活动中 ["2023-01-13", "2023-01-17"]。 - 活动 ["2023-01-18", "2023-01-25"] 不与任何其他活动重叠,所以我们保持原样。 大厅 2: - 两个活动 ["2022-12-09", "2022-12-23"] 和 ["2022-12-13", "2022-12-17"] 重叠。我们将它们合并到一个活动中 ["2022-12-09", "2022-12-23"]。 大厅 3: - 大厅只有一个活动,所以我们返回它。请注意,我们只分别考虑每个大厅的活动。
原站题解
mysql 解法, 执行用时: 483 ms, 内存消耗: 0 B, 提交时间: 2023-10-16 14:56:29
# Write your MySQL query statement below # 临时变量 with t as ( select *, @g:=if(@h = hall_id and @e >= start_day, @g, @g + 1) as g, @e:=if(@h = hall_id and @e >= end_day, @e, end_day), @h:=hall_id from (select * from HallEvents order by hall_id, start_day) as hall, (select @g:=0, @e:=null, @h:=null) as init ) select hall_id, min(start_day) as start_day, max(end_day) as end_day from t group by g;
pythondata 解法, 执行用时: 432 ms, 内存消耗: 61 MB, 提交时间: 2023-10-16 14:55:25
import pandas as pd from collections import defaultdict def merge_events(hall_events: pd.DataFrame) -> pd.DataFrame: d = defaultdict(list) for _, row in hall_events.iterrows(): d[row['hall_id']].append([row['start_day'], row['end_day']]) hall_list = [] start_day_list = [] end_day_list = [] for hall_id, lst in d.items(): lst.sort() temp = lst[0] for i in range(1, len(lst)): if temp and temp[-1] >= lst[i][0]: temp[-1] = max(temp[-1], lst[i][1]) elif temp: hall_list.append(hall_id) start_day_list.append(temp[0]) end_day_list.append(temp[1]) temp = lst[i] if temp: hall_list.append(hall_id) start_day_list.append(temp[0]) end_day_list.append(temp[1]) return pd.DataFrame({'hall_id': hall_list, 'start_day': start_day_list, 'end_day': end_day_list})