高效日程管理:利用区间合并算法优化活动安排【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)

输出解释

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

总结

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

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

相关文章
|
4天前
|
算法 调度
基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图
车间作业调度问题(JSSP)通过遗传算法(GA)和模拟退火算法(SA)优化多个作业在并行工作中心上的加工顺序和时间,以最小化总完成时间和机器闲置时间。MATLAB2022a版本运行测试,展示了有效性和可行性。核心程序采用作业列表表示法,结合遗传操作和模拟退火过程,提高算法性能。
|
2天前
|
算法 Python
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果;贪心算法在每一步选择局部最优解,追求全局最优;动态规划通过保存子问题的解,避免重复计算,确保全局最优。这三种算法各具特色,适用于不同类型的问题,合理选择能显著提升编程效率。
16 2
|
4天前
|
人工智能 算法 大数据
Linux内核中的调度算法演变:从O(1)到CFS的优化之旅###
本文深入探讨了Linux操作系统内核中进程调度算法的发展历程,聚焦于O(1)调度器向完全公平调度器(CFS)的转变。不同于传统摘要对研究背景、方法、结果和结论的概述,本文创新性地采用“技术演进时间线”的形式,简明扼要地勾勒出这一转变背后的关键技术里程碑,旨在为读者提供一个清晰的历史脉络,引领其深入了解Linux调度机制的革新之路。 ###
|
15天前
|
人工智能 算法 数据安全/隐私保护
基于遗传优化的SVD水印嵌入提取算法matlab仿真
该算法基于遗传优化的SVD水印嵌入与提取技术,通过遗传算法优化水印嵌入参数,提高水印的鲁棒性和隐蔽性。在MATLAB2022a环境下测试,展示了优化前后的性能对比及不同干扰下的水印提取效果。核心程序实现了SVD分解、遗传算法流程及其参数优化,有效提升了水印技术的应用价值。
|
14天前
|
存储 缓存 算法
优化轮询算法以提高资源分配的效率
【10月更文挑战第13天】通过以上这些优化措施,可以在一定程度上提高轮询算法的资源分配效率,使其更好地适应不同的应用场景和需求。但需要注意的是,优化策略的选择和实施需要根据具体情况进行详细的分析和评估,以确保优化效果的最大化。
|
15天前
|
并行计算 算法 IDE
【灵码助力Cuda算法分析】分析共享内存的矩阵乘法优化
本文介绍了如何利用通义灵码在Visual Studio 2022中对基于CUDA的共享内存矩阵乘法优化代码进行深入分析。文章从整体程序结构入手,逐步深入到线程调度、矩阵分块、循环展开等关键细节,最后通过带入具体值的方式进一步解析复杂循环逻辑,展示了通义灵码在辅助理解和优化CUDA编程中的强大功能。
|
14天前
|
机器学习/深度学习 人工智能 算法
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
车辆车型识别,使用Python作为主要编程语言,通过收集多种车辆车型图像数据集,然后基于TensorFlow搭建卷积网络算法模型,并对数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操作界面,实现用户上传一张车辆图片识别其类型。
54 0
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
|
15天前
|
存储 缓存 算法
前端算法:优化与实战技巧的深度探索
【10月更文挑战第21天】前端算法:优化与实战技巧的深度探索
13 1
|
16天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于贝叶斯优化CNN-LSTM网络的数据分类识别算法matlab仿真
本项目展示了基于贝叶斯优化(BO)的CNN-LSTM网络在数据分类中的应用。通过MATLAB 2022a实现,优化前后效果对比明显。核心代码附带中文注释和操作视频,涵盖BO、CNN、LSTM理论,特别是BO优化CNN-LSTM网络的batchsize和学习率,显著提升模型性能。
|
18天前
|
机器学习/深度学习 算法 Java
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
下一篇
无影云桌面