一 题目
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.
NOTE: input types have been changed on April 15, 2019. Please reset to default code definition to get new method signature.
二 分析
medium 级别,求数组里面重合的区间,合并为一个。
这个题目挺啰嗦的,我一开始就犯错就掉坑了,遍历数组的时候前后各种判断。后来想了想,得先排序,这样就不用这么复杂了。 排序就是按照intervals【0】,需要自定义Comparator。先把第一个区间作为参照,然后从第二个开始遍历区间集,如果结果中最后一个区间和遍历的当前区间无重叠,直接将当前区间存入结果中,如果有重叠,将结果中最后一个区间的 end 值更新为结果中最后一个区间的 end 和当前 end 值之中的较大值,然后继续遍历区间集。
public static void main(String[] args) {
int[][] intervals1 ={
{1,4},{0,4}
};
int[][] res1 = merge(intervals1);
System.out.println(JSON.toJSON( res1));
int[][] intervals2 ={
{1,4},{4,5}
};
int[][] res2 = merge(intervals2);
System.out.println(JSON.toJSON( res2));
int[][] intervals ={
{1,3},{2,6},{8,10},{15,18}
};
int[][] res = merge(intervals);
System.out.println(JSON.toJSON( res));
}
public static int[][] merge(int[][] intervals) {
//conner case
if(intervals.length <=1){
return intervals;
}
int size = intervals.length;
//先排序
Arrays.sort(intervals, new Comparator<int[]>(){
@Override
public int compare(int[] o1, int[] o2) {
// TODO Auto-generated method stub
return Integer.compare(o1[0],o2[0]);
}
});
int [] current = intervals[0];
List<int[]> res = new ArrayList<int[]>();
//遍历
for(int i=1;i< intervals.length;i++ ){
//独立的
if(current[1]< intervals[i][0] ){
res.add(intervals[i]);
current = intervals[i];
}
else{
current[1] = Math.max(current[1], intervals[i][1]);
}
}
res.add(current);
return res.toArray(new int[0][0]);
}
Runtime: 6 ms, faster than 88.51% of Java online submissions for Merge Intervals.
Memory Usage: 38.6 MB, less than 97.83% of Java online submissions for Merge Intervals.