高效日程管理:利用区间合并算法优化活动安排【python LeetCode57】

简介: 高效日程管理:利用区间合并算法优化活动安排【python LeetCode57】

作者介绍:10年大厂数据\经营分析经验,现任大厂数据部门负责人。

会一些的技术:数据分析、算法、SQL、大数据相关、python

欢迎加入社区:码上找工作

作者专栏每日更新:

LeetCode解锁1000题: 打怪升级之旅

python数据分析可视化:企业实战案例

题目描述

给出一个无重叠的,按照区间起始端点排序的区间列表。在列表中插入一个新的区间,你需要确保列表仍然按照区间起始端点有序且不重叠(如果有必要的话,可以合并区间)。

输入格式
  • intervals:一个二维数组,每个内部数组包含两个整数,表示一个区间的起始和结束位置。
  • newInterval:一个包含两个整数的数组,表示需要插入的新区间的起始和结束位置。
输出格式
  • 返回一个二维整数数组,表示合并后的区间。

示例

示例 1
输入: intervals = [[1,3],[6,9]], newInterval = [2,5]
输出: [[1,5],[6,9]]
示例 2
输入: intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
输出: [[1,2],[3,10],[12,16]]
解释: 新区间 [4,8] 与 [3,5],[6,7],[8,10] 重叠。

方法一:直接合并

解题步骤
  1. 添加新区间:将新区间添加到区间列表中。
  2. 排序:按每个区间的起始位置进行排序。
  3. 合并区间:使用一个循环遍历排序后的区间列表,合并所有重叠的区间。
完整的规范代码
def insert(intervals, newInterval):
    """
    直接合并新区间
    :param intervals: List[List[int]], 输入的区间列表
    :param newInterval: List[int], 需要插入的新区间
    :return: List[List[int]], 合并后的区间列表
    """
    intervals.append(newInterval)
    intervals.sort(key=lambda x: x[0])
    merged = []
    for interval in intervals:
        if not merged or merged[-1][1] < interval[0]:
            merged.append(interval)
        else:
            merged[-1][1] = max(merged[-1][1], interval[1])
    return merged
# 示例调用
print(insert([[1,3],[6,9]], [2,5]))  # 输出: [[1,5],[6,9]]
print(insert([[1,2],[3,5],[6,7],[8,10],[12,16]], [4,8]))  # 输出: [[1,2],[3,10],[12,16]]
算法分析
  • 时间复杂度:(O(n log n)),主要耗时操作是排序。
  • 空间复杂度:(O(n)),存储合并后的区间。

方法二:优化的插入合并

解题步骤
  1. 找到插入位置:遍历区间列表,找到新区间的正确插入位置。
  2. 合并区间:在插入位置处合并新区间,如果新区间与现有区间重叠,进行合并处理。
  3. 构建最终结果:将处理后的区间重新组装成结果列表。
完整的规范代码
def insert(intervals, newInterval):
    """
    优化的插入合并方法
    :param intervals: List[List[int]], 输入的区间列表
    :param newInterval: List[int], 需要插入的新区间
    :return: List[List[int]], 合并后的区间列表
    """
    merged, i = [], 0
    start, end = newInterval[0], newInterval[1]
    
    # 添加所有结束时间小于新区间开始时间的区间
    while i < len(intervals) and intervals[i][1] < start:
        merged.append(intervals[i])
        i += 1
    
    # 合并所有与新区间重叠的区间
    while i < len(intervals) and intervals[i][0] <= end:
        start = min(start, intervals[i][0])
        end = max(end, intervals[i][1])
        i += 1
    merged.append([start, end])
    
    # 添加剩余区间
    while i < len(intervals):
        merged.append(intervals[i])
        i += 1
    return merged
# 示例调用
print(insert([[1,3],[6,9]], [2,5]))  # 输出: [[1,5],[6,9]]
print(insert([[1,2],[3,5],[6,7],[8,10],[12,16]], [4,8]))  # 输出: [[1,2],[3,10],[12,16]]
算法分析
  • 时间复杂度:(O(n)),其中 n 是区间的数量,最坏情况下需要遍历所有区间。
  • 空间复杂度:(O(n)),用于存储合并后的区间。

方法三:二分查找插入位置

此方法使用二分查找来确定新区间插入的位置,以减少查找时间,然后使用类似方法二的方式进行区间合并。

解题步骤
  1. 二分查找:使用二分查找确定新区间插入的位置。
  2. 合并区间:在找到的位置处插入新区间,并执行合并操作。
  3. 构建结果:按照合并逻辑构建最终的区间列表。
完整的规范代码
def insert(intervals, newInterval):
    """
    使用二分查找优化插入位置的确定
    :param intervals: List[List[int]], 输入的区间列表
    :param newInterval: List[int], 需要插入的新区间
    :return: List[List[int]], 合并后的区间列表
    """
    low, high = 0, len(intervals) - 1
    while low <= high:
        mid = (low + high) // 2
        if intervals[mid][1] < newInterval[0]:
            low = mid + 1
        elif intervals[mid][0] > newInterval[1]:
            high = mid - 1
        else:
            newInterval = [min(intervals[mid][0], newInterval[0]), max(intervals[mid][1], newInterval[1])]
            intervals.pop(mid)
            return insert(intervals, newInterval)
    
    intervals.insert(low, newInterval)
    return intervals
# 示例调用
print(insert([[1,3],[6,9]], [2,5]))  # 输出: [[1,5],[6,9]]
print(insert([[1,2],[3,5],[6,7],[8,10],[12,16]], [4,8]))  # 输出: [[1,2],[3,10],[12,16]]
算法分析
  • 时间复杂度:(O(n log n)),二分查找 (O(log n)) 加上最坏情况下的合并操作 (O(n))。
  • 空间复杂度:(O(n)),用于存储合并后的区间。

方法四:利用堆结构优化

尽管这方法在合并区间问题中不是最常用的方法,它主要用于处理实时数据流中的区间合并问题。我们暂时跳过此方法的具体实现。

方法五:利用线段树优化

此方法主要用于处理大规模数据集中的动态区间查询和更新问题,因复杂度较高,在此场景下并不常用,暂不展开。

不同算法的优劣势对比

特征 方法一: 直接合并 方法二: 优化合并 方法三: 二分查找插入 方法四: 利用堆结构 方法五: 线段树
时间复杂度 (O(n log n)) (O(n)) (O(n log n)) (O(n log n)) (O(log n))
空间复杂度 (O(n)) (O(n)) (O(n)) (O(n)) (O(n))
优势 简单直观 高效,适合大部分场景 查找效率高 实时处理优化 动态更新优化
劣势 效率不是最优 需要手动处理边界 实现复杂 空间复杂度高 实现复杂度高

应用示例详解:事件日程管理系统

场景描述

在公司或社区的事件日程管理中,管理员需要添加和更新活动的时间,同时确保没有时间上的冲突。这些活动可能包括会议、研讨会、社区聚会等,每个活动都有明确的开始和结束时间。有效的时间管理不仅可以优化资源使用,还能提高参与者的满意度。

技术实现

使用区间插入和合并算法可以帮助系统管理员高效地管理和调整日程安排,以下是具体的实现方法和步骤:

方法:优化的插入合并

技术选择

选择方法二(优化的插入合并),因为它直接在原有区间列表上操作,避免了排序的开销,且在实际应用中能快速响应日程变动。

实现步骤

  1. 初始化日程列表:开始时,日程列表为空或已有一些预设活动。
  2. 插入新活动:每次有新活动(新区间)加入时,根据该活动的开始和结束时间插入并尝试合并。
  3. 合并处理:插入新区间后,检查并合并任何重叠的区间。
  4. 更新日程:合并完成后,更新日程列表,保持列表中的区间始终无重叠且有序。

代码实现

def insert(intervals, newInterval):
    """
    优化的插入合并方法,适用于日程管理
    :param intervals: List[List[int]], 现有的区间列表(活动日程)
    :param newInterval: List[int], 新活动的区间
    :return: List[List[int]], 更新后的区间列表
    """
    merged = []
    i, n = 0, len(intervals)
    # 处理所有在新区间前结束的区间
    while i < n and intervals[i][1] < newInterval[0]:
        merged.append(intervals[i])
        i += 1
    # 合并所有与新区间重叠的区间
    while i < n and intervals[i][0] <= newInterval[1]:
        newInterval = [min(newInterval[0], intervals[i][0]), max(newInterval[1], intervals[i][1])]
        i += 1
    merged.append(newInterval)
    # 添加剩余的区间
    while i < n:
        merged.append(intervals[i])
        i += 1
    return merged
# 示例日程
existing_events = [[9, 12], [13, 16]]
new_event = [12, 14]
# 日程更新
updated_events = insert(existing_events, new_event)
print("Updated event schedule:", updated_events)

输出解释

  • 程序首先将新活动尝试与现有活动合并。
  • 如果新活动时间与现有活动重叠或连续,它们会被合并为一个活动,从而优化空间利用并避免冲突。
应用优势
  • 高效性:直接操作,避免不必要的数据处理,响应速度快。
  • 准确性:确保日程中活动的时间不会重叠,避免资源冲突。
  • 灵活性:方便对日程进行动态调整,满足突发事件的处理需求。

总结

通过在事件日程管理系统中应用区间合并算法,管理员可以更有效地处理和更新日程安排,确保所有活动都能顺利进行而不互相冲突。这种方法不仅提升了管理效率,还增强了系统对于变动的适应能力,是现代大规模活动管理中不可或缺的技术手段。

欢迎关注微信公众号 数据分析螺丝钉

相关文章
|
1天前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
87 55
|
17天前
|
搜索推荐 Python
利用Python内置函数实现的冒泡排序算法
在上述代码中,`bubble_sort` 函数接受一个列表 `arr` 作为输入。通过两层循环,外层循环控制排序的轮数,内层循环用于比较相邻的元素并进行交换。如果前一个元素大于后一个元素,就将它们交换位置。
119 67
|
17天前
|
存储 搜索推荐 Python
用 Python 实现快速排序算法。
快速排序的平均时间复杂度为$O(nlogn)$,空间复杂度为$O(logn)$。它在大多数情况下表现良好,但在某些特殊情况下可能会退化为最坏情况,时间复杂度为$O(n^2)$。你可以根据实际需求对代码进行调整和修改,或者尝试使用其他优化策略来提高快速排序的性能
114 61
|
19天前
|
算法 数据安全/隐私保护 开发者
马特赛特旋转算法:Python的随机模块背后的力量
马特赛特旋转算法是Python `random`模块的核心,由松本真和西村拓士于1997年提出。它基于线性反馈移位寄存器,具有超长周期和高维均匀性,适用于模拟、密码学等领域。Python中通过设置种子值初始化状态数组,经状态更新和输出提取生成随机数,代码简单高效。
101 63
|
11天前
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
77 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
13天前
|
算法
基于GA遗传算法的PID控制器参数优化matlab建模与仿真
本项目基于遗传算法(GA)优化PID控制器参数,通过空间状态方程构建控制对象,自定义GA的选择、交叉、变异过程,以提高PID控制性能。与使用通用GA工具箱相比,此方法更灵活、针对性强。MATLAB2022A环境下测试,展示了GA优化前后PID控制效果的显著差异。核心代码实现了遗传算法的迭代优化过程,最终通过适应度函数评估并选择了最优PID参数,显著提升了系统响应速度和稳定性。
|
17天前
|
数据采集 存储 算法
Python 中的数据结构和算法优化策略
Python中的数据结构和算法如何进行优化?
|
10天前
|
算法
基于WOA鲸鱼优化的购售电收益与风险评估算法matlab仿真
本研究提出了一种基于鲸鱼优化算法(WOA)的购售电收益与风险评估算法。通过将售电公司购售电收益风险计算公式作为WOA的目标函数,经过迭代优化计算出最优购电策略。实验结果表明,在迭代次数超过10次后,风险价值收益优化值达到1715.1万元的最大值。WOA还确定了中长期市场、现货市场及可再生能源等不同市场的最优购电量,验证了算法的有效性。核心程序使用MATLAB2022a实现,通过多次迭代优化,实现了售电公司收益最大化和风险最小化的目标。
|
14天前
|
算法
通过matlab分别对比PSO,反向学习PSO,多策略改进反向学习PSO三种优化算法
本项目使用MATLAB2022A版本,对比分析了PSO、反向学习PSO及多策略改进反向学习PSO三种优化算法的性能,主要通过优化收敛曲线进行直观展示。核心代码实现了标准PSO算法流程,加入反向学习机制及多种改进策略,以提升算法跳出局部最优的能力,增强全局搜索效率。
|
10天前
|
算法
通过matlab对比遗传算法优化前后染色体的变化情况
该程序使用MATLAB2022A实现遗传算法优化染色体的过程,通过迭代选择、交叉和变异操作,提高染色体适应度,优化解的质量,同时保持种群多样性,避免局部最优。代码展示了算法的核心流程,包括适应度计算、选择、交叉、变异等步骤,并通过图表直观展示了优化前后染色体的变化情况。