思路 : 贪心:
本题相当于给区间分组
对区间进行sort 按左端点 由小到大进行排序。
1.当第i个区间的 左端点在上一个区间的右端点外, 则开启下一个区间组。 下一个区间组 的左端点为当前区间的左端点。
- 当第i个区间的右端点在上一个区间内 ,则更新当前区间组的右端点:
m a x r = m a x ( m a x r , r ) max_r = max(max_r,r) maxr=max(maxr,r)
上图
class Solution {
public int[][] merge(int[][] intervals) {
List<int[]> list = new ArrayList<>();
//重写comparator 对每个线段区间 进行排序
Arrays.sort(intervals,new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
if (o1[0] == o2[0])
return o1[1] - o2[1];
return o1[0] - o2[0];
}
});
int st = intervals[0][0], ed =intervals[0][1];
// 遍历线段进行加入list集合
for(int i = 1 ; i < intervals.length ; ++i) {
// 判断是否是同意区间
if(intervals[i][0] <= ed) {
// 记录合并区间最大值
ed = Math.max(ed , intervals[i][1]);
st = Math.min(st,intervals[i][0]);
}else {
// 保存上一个区间
list.add(new int[] {st,ed});
st = intervals[i][0];
ed = intervals[i][1];
}
}
list.add(new int[]{st,ed});
int[][] ans = new int[list.size()][2];
int cnt = 0 ;
for(int[] arr : list){
ans[cnt][0] = arr[0];
ans[cnt][1] = arr[1];
cnt++;
}
return ans;
}
}