56_合并区间(算法思路,优化和复杂度分析)

98 阅读1分钟

题目描述

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

示例 1:

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

示例 2:

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

思路

  • 排序:首先对区间按照起始点 (a[0]) 进行升序排序。
  • 合并区间:遍历排序后的区间,判断当前区间是否与结果数组中的最后一个区间重叠。
    • 如果当前区间的起始点小于等于结果数组最后一个区间的结束点,说明两者重叠,可以合并。
    • 如果不重叠,则将当前区间直接添加到结果数组中。

复杂度分析

时间复杂度

  • O(n log n):主要由排序步骤决定,排序需要 O(n log n) 时间。
  • O(n):遍历区间进行合并的过程需要 O(n) 时间。
  • 总时间复杂度O(n log n),因为排序的时间复杂度主导整体复杂度。

空间复杂度

O(n):在最坏情况下(所有区间互不重叠),结果数组 res 需要存储所有 n 个区间

code

var merge = function(intervals) {
    intervals.sort((a, b) => a[0] - b[0])
    const res = [intervals[0]]
    let len = 0
    for(let i = 1; i < intervals.length; i++){
        let item = intervals[i]
        if(item[0] <= res[len][1] && item[1] >= res[len][1]){
            res[len][1] = item[1]
        }else if(item[0] > res[len][1]){
            res.push(item)
            len++
        }
    }
    return res
};