题目描述:
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.
思路:
关键点:如何判断两个区间是否重叠
按照每个区间的start进行排序之后很容易判断相邻的两个区间是否有交集,若前一个区间的end大于后一个区间的start,则它们
是重叠的。而合并区间时,我们保留第一个区间的start并在两个区间的end中取最大。
1:设一个temp为第一个区间,遍历剩下的区间,然后每次拿temp和这个区间做比较,若遇到了重叠区间,则将temp更新为merge
后的区间,且不加入结果集,因为它还有可能继续和下一个区间重叠。
2:当temp和区间不重叠时,将temp加入list,再将这个区间设为新的temp。
实现1:数组的格式给出数据
import java.util.Arrays;
class Solution {
public int[][] merge(int[][] intervals) {
int len=intervals.length;
if(intervals==null||len<=1) return intervals;
//根据每个数组的start进行排序
Arrays.sort(intervals,new Comparator<int[]>(){
public int compare(int[] i1,int[] i2){
return i1[0]-i2[0];
}
});
int num=0;//记录合并完数组的元素个数
for(int i=1;i<len;i++){
if(intervals[i][0]<=intervals[num][1]){//第二个区间的start小于第一个区间的end
if(intervals[i][1]>intervals[num][1]){
intervals[num][1]=intervals[i][1];
}
}else{//不能合并,将数字加入
num++;
intervals[num]=intervals[i];//将当前的interval设置成最新的inerval
}
}
return Arrays.copyOfRange(intervals,0,num+1);// copyOfRange将指定数组的指定范围复制到一个新数组。
}
}
实现2:list的形式给出数据
class Interval{
int start;
int end;
Interval() {
// TODO Auto-generated constructor stub
start=0;
end=0;
}
Interval(int s,int e){
start=s;
end=e;
}
}
public List<Interval> merge(List<Interval> intervals) {
List<Interval> ret=new ArrayList<Interval>();
if(intervals.size()<1){
return ret;
}
Collections.sort(intervals,new Comparator<Interval>() {
public int compare(Interval i1,Interval i2){
return i1.start-i2.start;
}
});
Interval p=intervals.get(0),tmp;
int i=1;
while(i<intervals.size()){
tmp=intervals.get(i);
if(tmp.start<=p.end){
p.end=Math.max(p.end, tmp.end);
}else{
ret.add(p);
p=tmp;
}
i++;
}
ret.add(p);
return ret;
}
215

被折叠的 条评论
为什么被折叠?



