leetcode TOP100(13)合并区间

/**
 * 以数组 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] 可被视为重叠区间。

package TOP11_20;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 以数组 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] 可被视为重叠区间。 */ public class TOP13 { public static int[][] merge(int[][] intervals) { // 先按照左边界大小排序 Arrays.sort(intervals, (v1, v2) -> v1[0] - v2[0]); List result = new ArrayList<>(); result.add(intervals[0]); // 排序之后 只有前一个的右边界小于后一个的左边界才合并,合并之后的新的数组的左边界是原来的左边界,右边界是原来数组和被合并数组右边界中大的一个值 for (int[] interval : intervals) { if (result.size()==0||interval[0] > result.get(result.size()-1)[1]) { result.add(interval); } else { result.get(result.size()-1)[1] = Math.max(result.get(result.size()-1)[1], interval[1]); } } return result.toArray(new int[result.size()][2]); } public static void main(String[] args) { int[][] a = {{1,3},{8,10},{2,6},{15,18}}; int[][] result = merge(a); System.out.println(merge(a).toString()); } }

你可能感兴趣的:(算法,leetcode,算法,职场和发展)