【数组】Leetcode 56. 合并区间【中等】

合并区间 其他算法导航栏

  • 以数组 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].

解题思路

  • 1、首先,将区间按照起始位置进行排序,这样可以确保相邻的区间能够连续合并。
  • 2、遍历排序后的区间数组,使用一个新的区间列表 result 来存储合并后的区间。
  • 3、对于每个区间 intervals[i],如果 result 为空或者当前区间的起始位置大于 result 中最后一个区间的结束位置,则说明当前区间与 result 中的区间不重叠,直接将当前区间加入 result 中。
  • 4、否则,当前区间与 result 中的最后一个区间重叠,合并两个区间,更新 result 中最后一个区间的结束位置为当前区间的结束位置与 result 中最后一个区间的结束位置中的较大值。
  • 5、遍历完成后,result 中存储的即为合并后的不重叠区间数组。

Java实现

public class MergeIntervals {
    public static int[][] merge(int[][] intervals) {
        if (intervals == null || intervals.length == 0) {
            return new int[0][];
        }
        // 按照起始位置进行排序
        Arrays.sort(intervals, Comparator.comparingInt(a -> a[0]));
        //结果列表
        List<int[]> result = new ArrayList<>();
        //先将第一个区间加入
        result.add(intervals[0]);

        for (int i = 1; i < intervals.length; i++) {
            //当前区间
            int[] currentInterval = intervals[i];
            //上一个区间
            int[] lastInterval = result.get(result.size() - 1);
            // 判断当前区间是否和下一个区间有重叠
            // 当前区间的起始位置大于结果列表中最后一个区间的结束位置,则不重叠
            if (currentInterval[0] > lastInterval[1]) {
                //不重叠,直接加入结果列表
                result.add(currentInterval);
            } else {
                // 合并重叠区间
                lastInterval[1] = Math.max(lastInterval[1], currentInterval[1]);
            }
        }
        return result.toArray(new int[result.size()][]);
    }
    public static void main(String[] args) {
        MergeIntervals mergeIntervals = new MergeIntervals();
        int[][] intervals = {{1, 3}, {2, 6}, {8, 10}, {15, 18}};
        int[][] result = mergeIntervals.merge(intervals);
        
        for (int[] interval : result) {
            System.out.println(Arrays.toString(interval));
        }
    }
}

时间空间复杂度

  • 时间复杂度:O(nlogn),其中 n 是区间的个数,排序的时间复杂度为 O(nlogn),遍历合并的时间复杂度为 O(n)。
  • 空间复杂度:O(n),用于存储合并后的不重叠区间数组。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值