力扣经典150题第四十八题:合并区间

目录

题目描述和要求

给定一个数组 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] 可被视为重叠区间。

解题思路

我们可以对区间按照起始位置进行排序,然后依次遍历每个区间,合并重叠的区间。具体步骤如下:

  1. 对区间按照起始位置进行排序。
  2. 初始化一个结果列表,用于存储合并后的区间。
  3. 遍历排序后的区间,如果当前区间与结果列表中最后一个区间重叠,则更新最后一个区间的结束位置;否则,将当前区间加入结果列表。
  4. 返回结果列表。

算法实现

java 复制代码
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class MergeIntervals {
    public int[][] merge(int[][] intervals) {
        if (intervals == null || intervals.length == 0) {
            return new int[0][];
        }

        Arrays.sort(intervals, (a, b) -> a[0] - b[0]);

        List<int[]> merged = new ArrayList<>();
        for (int[] interval : intervals) {
            if (merged.isEmpty() || merged.get(merged.size() - 1)[1] < interval[0]) {
                merged.add(interval);
            } else {
                merged.get(merged.size() - 1)[1] = Math.max(merged.get(merged.size() - 1)[1], interval[1]);
            }
        }

        return merged.toArray(new int[merged.size()][]);
    }
}

复杂度分析

  • 时间复杂度:O(nlogn),其中 n 为区间的数量。排序的时间复杂度为 O(nlogn),遍历一次区间的时间复杂度为 O(n)。
  • 空间复杂度:O(logn)~O(n),取决于排序的实现方式和额外空间的使用情况。

测试和验证

编写测试用例对算法进行验证,确保其正确性和健壮性。

java 复制代码
public class Main {
    public static void main(String[] args) {
        MergeIntervals mergeIntervals = new MergeIntervals();

        int[][] intervals1 = {{1, 3}, {2, 6}, {8, 10}, {15, 18}};
        System.out.println(Arrays.deepToString(mergeIntervals.merge(intervals1))); // [[1,6],[8,10],[15,18]]

        int[][] intervals2 = {{1, 4}, {4, 5}};
        System.out.println(Arrays.deepToString(mergeIntervals.merge(intervals2))); // [[1,5]]
    }
}

总结和拓展

本题通过对区间按照起始位置进行排序,然后合并重叠的区间,实现了对给定区间的合并操作。这个算法思路清晰简单,在处理类似问题时是一个不错的选择。

此外,我们也可以考虑其他方法实现区间合并,例如使用栈或递归等方式,来实现同样的功能。

参考资料

  • 《力扣经典150题》
  • LeetCode 官方网站
相关推荐
hsling松子4 小时前
使用PaddleHub智能生成,献上浓情国庆福
人工智能·算法·机器学习·语言模型·paddlepaddle
dengqingrui1235 小时前
【树形DP】AT_dp_p Independent Set 题解
c++·学习·算法·深度优先·图论·dp
C++忠实粉丝5 小时前
前缀和(8)_矩阵区域和
数据结构·c++·线性代数·算法·矩阵
ZZZ_O^O6 小时前
二分查找算法——寻找旋转排序数组中的最小值&点名
数据结构·c++·学习·算法·二叉树
CV-King6 小时前
opencv实战项目(三十):使用傅里叶变换进行图像边缘检测
人工智能·opencv·算法·计算机视觉
代码雕刻家6 小时前
数据结构-3.9.栈在递归中的应用
c语言·数据结构·算法
雨中rain6 小时前
算法 | 位运算(哈希思想)
算法
Kalika0-08 小时前
猴子吃桃-C语言
c语言·开发语言·数据结构·算法
sp_fyf_20248 小时前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-02
人工智能·神经网络·算法·计算机视觉·语言模型·自然语言处理·数据挖掘
我是哈哈hh10 小时前
专题十_穷举vs暴搜vs深搜vs回溯vs剪枝_二叉树的深度优先搜索_算法专题详细总结
服务器·数据结构·c++·算法·机器学习·深度优先·剪枝