题目:
给出一个区间的集合,请合并所有重叠的区间。
示例 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] 可被视为重叠区间。
代码:
class Solution {
// 贪心算法
// 每次遍历到一个位置时,该位置之前的区间都已经整合好了
public int[][] merge(int[][] intervals) {
int[][] impty = new int[intervals.length][];
if (intervals.length == 0) {
return impty;
}
List<List<Integer>> res = new ArrayList<>();
for (int i = 0; i < intervals.length; i++) {
List<Integer> list = new ArrayList<>();
for (int j = 0; j < intervals[i].length; j++) {
list.add(intervals[i][j]);
}
res.add(list);
}
// 给每个区间的首个元素大小进行比较排序
// 按照从小到大排序区间
Collections.sort(res, new Comparator<List<Integer>>(){
@Override
public int compare(List<Integer> o1,
List<Integer> o2) {
if (o1.get(0) > o2.get(0)) {
return 1;
} else if (o1.get(0) < o2.get(0)) {
return -1;
} else {
return 0;
}
}
});
// 开始进行遍历
// tmp 为最终结果
List<List<Integer>> tmp = new ArrayList<>();
tmp.add(res.get(0));
for (int i = 1; i < res.size(); i++) {
List<Integer> cur = res.get(i);
List<Integer> cur2 = tmp.get(tmp.size() - 1);
if (cur.get(0) > cur2.get(1)) {
tmp.add(cur);
} else {
int bigOne = Math.max(cur.get(1), cur2.get(1));
cur2.remove(1);
cur2.add(bigOne);
}
}
return helper(tmp);
}
// 将顺序表转换成二维数组
public int[][] helper(List<List<Integer>> res) {
int[][] arr = new int[res.size()][2];
for (int i = 0; i < res.size(); i++) {
int[] tmp = new int[2];
for (int j = 0; j < res.get(i).size(); j++) {
tmp[j] = res.get(i).get(j);
}
arr[i] = tmp;
}
return arr;
}
}