- Merge Intervals
Medium
3494
257
Add to List
Share
Given a collection of intervals, merge all overlapping intervals.
Example 1:
Input: [[1,3],[2,6],[8,10],[15,18]]
Output: [[1,6],[8,10],[15,18]]
Explanation: Since intervals [1,3] and [2,6] overlaps, merge them into [1,6].
Example 2:
Input: [[1,4],[4,5]]
Output: [[1,5]]
Explanation: Intervals [1,4] and [4,5] are considered overlapping.
思路
if overlap
merge intervals
else
class Solution {
public int[][] merge(int[][] intervals) {
/*
22ms 太慢
if(intervals.length <= 1){
return intervals;
}
//按照起始点排序
Arrays.sort(intervals,(a,b) -> (a[0] - b[0]));
List<int[]> result = new ArrayList<>();
for(int[] interval : intervals){
//if list is empty or does not overlap with previous, just append
if(result.isEmpty() || result.get(result.size()-1)[1] < interval[0]){
result.add(interval);
}
else{
// if overlap merge the cur and previousinterval
result.get(result.size()-1)[1] = Math.max(result.get(result.size() -1)[1], interval[1]);
}
}
return result.toArray(new int[result.size()][]);
*/
//将数组排序
List<int[]> res = new ArrayList<>();
List<int[]> slist = new ArrayList<>();
for(int[]a:intervals)slist.add(a);
Collections.sort(slist, byBegDt);
for(int i = 0; i < slist.size(); i++){
int[] temp = slist.get(i);
while(i < intervals.length-1 && temp[1] >= slist.get(i+1)[0]){
i++;
int [] temp1 = slist.get(i);
temp[0] =Math.min(temp1[0], temp[0]);
temp[1] = Math.max(temp1[1],temp[1]);
}
res.add(temp);
}
int[][] resAr = new int[res.size()][2];
int i =0;
for(int[] ar:res){
resAr[i] = ar;
i++;
}
return resAr;
}
Comparator<int[]> byBegDt = new Comparator<int[]>(){
public int compare(int[] a, int [] b){
return a[0] - b[0];
}
};
}