本文主要是介绍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] 可被视为重叠区间。
思路
合并区间的思路如下:
-
排序:首先,我们需要对输入的区间数组按照每个区间的起始位置进行排序。这样做的原因是,如果区间有重叠,那么它们一定是连续的。通过排序,我们可以确保连续的区间在数组中是相邻的。
-
合并:遍历排序后的区间数组。对于每个区间,我们检查它是否与前一个区间重叠。如果重叠,我们就将当前区间与前一个区间合并,即将当前区间的结束位置更新为这两个区间的结束位置的较大值。
-
添加:如果当前区间与前一个区间不重叠,那么我们就将当前区间添加到结果列表中。
-
返回:最后,我们将结果列表转换为一个数组并返回。
这个算法的时间复杂度是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
方法来合并给定的区间数组。然后,我们打印出合并后的区间数组。
这篇关于leetcode56--合并区间的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!