56. 合并区间
题目描述:
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
考察重点:先对数组按照第一列进行排序,后续用startI记录每一个新行的起点,j负责遍历寻找startI之后与其相交的行。注意:这里将新区间记录在原数组中(由于从前向后遍历,这样存储并不影响原数组的遍历)。
public int[][] merge(int[][] intervals) {Arrays.sort(intervals, new Comparator<int[]> (){@Overridepublic int compare(int a[], int b[]){return a[0] - b[0];}}); int resLen = 0;int startI = 0;boolean endMark = false;while(startI < intervals.length - 1){for(int j = startI + 1;j < intervals.length;j ++){ // intervals[startI][0]记录当前区间的起点, intervals[startI][0]记录当前区间的终点if(intervals[startI][1] < intervals[j][0]){ //判断是否相交intervals[resLen][0] = intervals[startI][0]; // resLen记录新区间的intervals[resLen][1] = intervals[startI][1];startI = j;resLen ++;if(j == intervals.length - 1){ // 此处与下方两个判断,是考虑在最后一行无法和前面行合并;以及最后一行可以和前面行合并的这两种情况。intervals[resLen][0] = intervals[startI][0];intervals[resLen][1] = intervals[startI][1];}break;}else if(intervals[startI][1] >= intervals[j][0]){ // 两区间相交时,以intervals[startI][1]记录右范围intervals[startI][1] = Math.max(intervals[startI][1], intervals[j][1]); if(j == intervals.length - 1){intervals[resLen][0] = intervals[startI][0];intervals[resLen][1] = intervals[startI][1];startI = j;}}}}int[][] res = new int[resLen + 1][2];for(int x = 0; x <= resLen; x ++) {res[x][0] = intervals[x][0];res[x][1] = intervals[x][1];}return res;
}