题目要求:
分析:
这道题目的思路其实应该很清晰,一共分为以下几个步骤:
- 将给出的区间集合进行排序,将其左闭区间按照从小到大的顺序进行排列;
- 设置一个list集合,进行遍历和判断:
将能合并的进行合并,再add进list中;
不能合并的就直接add进list中; - 将最终得到的list利用toArray方法转成一个二维数组。
这里有一个难点,就是如何将这个区间集合进行排序,感谢这位大神的分享: Leetcode 56. 合并区间
这里采用的方法是:
采用匿名内部类重写Comparator接口中的compare方法,真是绝妙!!!
这个很重要!!!
具体代码如下:
class Solution {
public int[][] merge(int[][] intervals) {
Arrays.sort(intervals, new Comparator<int[]>() {
@Override
public int compare(int[] a1, int[] a2) {
return a1[0] - a2[0];
}
});
List<int[]> list = new ArrayList<>();
for(int i = 0; i < intervals.length; i ++) {
int start = intervals[i][0];
int end = intervals[i][1];
while(i < intervals.length - 1 && intervals[i + 1][0] <= end) {
end = Math.max(end, intervals[i + 1][1]);
//优化,如果合并过后,第i + 1个就不用再去遍历一遍了
i ++;
}
list.add(new int[] {start, end});
}
return list.toArray(new int[0][0]);
}
}