LeetCode-热题100:56. 合并区间

题目描述

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

示例 1:

输入: intervals = \[1,3,2,6,8,10,15,18]
输出: \[1,6,8,10,15,18]
解释: 区间 1,32,6 重叠, 将它们合并为 1,6.

示例 2:

输入: intervals = \[1,4,4,5]
输出: \[1,5]
解释: 区间 1,44,5 可被视为重叠区间。

提示:

  • 1 <= intervals.length <= 104
  • intervals[i].length == 2
  • 0 <= starti <= endi <= 104

代码及注释

go 复制代码
func merge(intervals [][]int) [][]int {
    res := make([][]int, 0)  // 结果数组
    sort.Slice(intervals, func(i, j int) bool {
        return intervals[i][0] < intervals[j][0]  // 按照区间的起始位置排序
    })
    
    if len(intervals) == 0 {
        return res  // 如果区间数组为空,直接返回空数组
    }
    
    left, right := intervals[0][0], intervals[0][1]  // 初始化左右边界为第一个区间的边界
    
    for i := 1; i < len(intervals); i++ {
        if intervals[i][0] <= right && intervals[i][1] > right {
            right = intervals[i][1]  // 更新右边界
        } else if intervals[i][0] > right {
            res = append(res, []int{left, right})  // 当前区间与前一个区间无重叠,将前一个区间添加到结果数组
            left, right = intervals[i][0], intervals[i][1]  // 更新左右边界
        }
    }
    
    res = append(res, []int{left, right})  // 添加最后一个合并后的区间
    return res
}

代码解释

  1. 初始化结果数组:

    • res 是用于存储合并后的区间的结果数组。
  2. 按照区间的起始位置排序:

    • 使用 sort.Slice 函数对 intervals 数组按照区间的起始位置进行排序。
  3. 处理边界情况:

    • 如果 intervals 数组为空,直接返回空的结果数组 res
    • 初始化左右边界为第一个区间的边界 intervals[0][0]intervals[0][1]
  4. 合并区间:

    • 遍历排序后的 intervals 数组。
    • 如果当前区间的起始位置 intervals[i][0] 小于等于当前的右边界 right 且当前区间的结束位置 intervals[i][1] 大于当前的右边界 right,更新右边界 right
    • 如果当前区间的起始位置 intervals[i][0] 大于当前的右边界 right,表示当前区间与前一个区间无重叠,将前一个区间 [left, right] 添加到结果数组 res,然后更新左右边界。
  5. 添加最后一个区间:

    • 遍历完成后,将最后一个合并后的区间 [left, right] 添加到结果数组 res
  6. 返回结果:

    • 返回结果数组 res

这段代码的时间复杂度是 O(nlogn),其中 n 是区间的数量,因为需要对区间进行排序。

相关推荐
V搜xhliang024620 分钟前
临床科研新范式:从选题到投稿,AI智能体如何接管全流程?
运维·数据结构·人工智能·算法·microsoft·数据挖掘·自动化
踏着七彩祥云的小丑1 小时前
Go学习第1天:入门
开发语言·学习·golang·go
计算机安禾1 小时前
【算法分析与设计】第46篇:近似难度与不可近似性理论
网络协议·算法·ssl
小bo波1 小时前
Java Swing 可视化素数筛:动态演示 1~120 质数筛选【附完整源码】
java·算法·可视化·swing·素数
imDwAaY1 小时前
贝叶斯网络到粒子滤波Python算法实现 CS188 Proj4 学习笔记
网络·人工智能·笔记·python·学习·算法
sleven fung1 小时前
Whisper库
开发语言·人工智能·python·算法·ai·whisper
Black蜡笔小新2 小时前
自动化AI算法训练服务器DLTM零代码私有化一站式AI训练平台技术解析
人工智能·算法·自动化
梦想的颜色2 小时前
MySQL 查询性能核武器
运维·服务器·数据结构·数据库·mysql
Mumu12182 小时前
P3212 [HNOI2011] 任务调度
算法
KWTXX2 小时前
vibe coding-提示词
java·前端·算法