力扣练习009---合并区间(56)
题目描述:
https://leetcode-cn.com/problems/merge-intervals/
给出一个区间的集合,请合并所有重叠的区间。
示例 1:
输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
题目分析:
1、不难想到,要比较不同区间的终止值和起始值,终止值大于起始值:区间合并;还要判断被合并的区间的终止值是否大于原区间的终止值;
2、但是要注意:输入并不像题目实例给的那样按照起始值排序;我第一次就想当然了。
3、因此,思路为先将输入按照起始值排序,然后按照1执行区间合并
Java代码:
public int[][] merge(int[][] intervals) { // 按照起始排序, 后续合并区间时, 按照是顺序合并即可 List<Interval> intervalList = Arrays.stream(intervals) .map(val -> new Interval(val[0], val[1])) .sorted(Comparator.comparingInt(val -> val.start)) .collect(Collectors.toList()); // 合并区间 LinkedList<Interval> linkedList = new LinkedList<>(); for (Interval interval : intervalList) { if (linkedList.isEmpty() || interval.start > linkedList.getLast().end) { linkedList.add(interval); } else { linkedList.getLast().end = Math.max(linkedList.getLast().end, interval.end); } } // 转换成二维数组输出 return linkedList.stream() .map(val -> new int[] {val.start, val.end}) .toArray(int[][]::new); } static class Interval { int start; int end; Interval(int start, int end) { this.start = start; this.end = end; } }
力扣运行结果:
心有猛虎,细嗅蔷薇
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步