列表

详情


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:
- 大厅只有一个活动,所以我们返回它。请注意,我们只分别考虑每个大厅的活动。

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
# Write your MySQL query statement below

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})

上一题