Java算法题-解析 "合并区间" 算法问题
题目:
给定一个区间的集合,合并所有重叠的区间。
引言:
"合并区间" 是一个关于排序和区间操作的经典问题。解决这个问题需要对数组操作、排序和区间操作有深刻理解,同时需要找到一种方法来合并重叠的区间。通过解答这个问题,我们可以提升对排序算法、区间操作和问题规模的考虑,同时也能拓展对数组问题的解决方案。
算法思路:
我们可以先将区间集合按照起始位置进行排序,然后按顺序遍历区间并合并重叠的区间。具体思路如下:
- 将区间集合按照起始位置进行升序排序。
- 创建一个结果列表
merged
,将第一个区间添加到merged
中。 - 遍历剩余的区间,比较当前区间的起始位置是否小于等于
merged
列表中最后一个区间的结束位置。如果是,说明两个区间重叠,合并这两个区间,更新merged
列表中最后一个区间的结束位置。 - 如果不重叠,将当前区间直接添加到
merged
列表中。 - 最终返回
merged
列表。
代码实现:
以下是使用 Java 实现的 "合并区间" 算法的示例代码:
import java.util.*;
public class MergeIntervals {
public int[][] merge(int[][] intervals) {
Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0]));
List<int[]> merged = new ArrayList<>();
for (int[] interval : intervals) {
if (merged.isEmpty() || interval[0] > merged.get(merged.size() - 1)[1]) {
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 + n) = O(nlogn)。
- 空间复杂度:需要一个结果列表
merged
来存储合并后的区间,所以空间复杂度为 O(n)。
示例和测试:
假设给定区间集合 intervals = [[1,3],[2,6],[8,10],[15,18]]
,根据算法,合并后的结果为 [[1,6],[8,10],[15,18]]
。
我们可以使用以下代码进行测试:
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
MergeIntervals solution = new MergeIntervals();
int[][] intervals = {
{1, 3},
{2, 6},
{8, 10},
{15, 18}
};
int[][] merged = solution.merge(intervals);
System.out.println("Merged intervals:");
for (int[] interval : merged) {
System.out.println(Arrays.toString(interval));
}
}
}
总结:
"合并区间" 算法题要求合并重叠的区间,是一个经典的排序和区间操作问题。通过实现这个算法,我们可以提升对排序算法、区间操作和问题规模的考虑,同时也能拓展对数组问题的解决方案。这个问题强调了如何通过排序和合并操作来合并重叠的区间,以得到最终合并后的结果。