leetcode56--合并区间

题目描述

以数组 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. 返回:最后,我们将结果列表转换为一个数组并返回。

这个算法的时间复杂度是O(n log n),因为我们需要对区间进行排序。其中,n是区间的数量。排序的时间复杂度是O(n log n),遍历区间的时间复杂度是O(n),所以总的时间复杂度是O(n log n)。

空间复杂度是O(n),因为在最坏的情况下,我们可能需要存储所有的区间(如果没有任何区间重叠)。

代码

import java.util.Arrays;
import java.util.Comparator;
import java.util.LinkedList;

public class Solution {
    public int[][] merge(int[][] intervals) {
        // 先按照区间的起始位置进行排序
        Arrays.sort(intervals, Comparator.comparingInt(a -> a[0]));

        LinkedList<int[]> merged = new LinkedList<>();
        for (int[] interval : intervals) {
            // 如果列表为空,或者当前区间与上一区间不重合,直接添加
            if (merged.isEmpty() || merged.getLast()[1] < interval[0]) {
                merged.add(interval);
            } else {
                // 否则,我们就可以确定前一个区间的结束位置一定是大于等于当前区间的开始位置的,
                // 所以我们就可以把当前区间合并到前一个区间
                merged.getLast()[1] = Math.max(merged.getLast()[1], interval[1]);
            }
        }

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

    public static void main(String[] args) {
        Solution solution = new Solution();
        int[][] intervals = {{1, 3}, {2, 6}, {8, 10}, {15, 18}};
        int[][] mergedIntervals = solution.merge(intervals);
        for (int[] interval : mergedIntervals) {
            System.out.println(Arrays.toString(interval));
        }
    }
}

 

这段代码首先对输入的区间数组按照起始位置进行排序。然后,我们创建一个空的LinkedList来存储合并后的区间。对于每个区间,我们检查它是否与merged中的最后一个区间重叠。如果merged为空或者当前区间的起始位置大于merged中最后一个区间的结束位置,那么我们就直接将当前区间添加到merged中。否则,我们就将当前区间与merged中的最后一个区间合并,即将当前区间的结束位置更新为这两个区间的结束位置的较大值。

最后,我们将merged转换为一个数组并返回。

main方法中,我们创建了一个Solution对象,并调用merge方法来合并给定的区间数组。然后,我们打印出合并后的区间数组。

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值