题目:
给出一组区间,请合并所有重叠的区间。
例如,
给出[1,3],[2,6],[8,10],[15,18],
返回[1,6],[8,10],[15,18].
思路:
首先将lists中的每一个Interval的两个数字分别放入两个数组中,分别是starts数组和ends数组。
其次对starts数组和ends数组进行sort排序。
最后,对starts数组中下标为 i+1 的start和ends数组中下标为 i 的end进行比较。当下标为 i+1的start 大于 下标为i 的end 时,就新建一个Interval,进行合并有重叠区间的Interval。
代码:
package com.company;
import com.sun.corba.se.impl.naming.cosnaming.InternalBindingValue;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
//定义一个interval类型
class Interval{
int start;
int end;
Interval(){
start=0;
end=0;
}
Interval(int s,int e){
start=s;
end=e;
}
}
public class TestNo18 {
public static void main(String[] args) {
TestNo18 t = new TestNo18();
Interval i1 = new Interval(1,3);
Interval i2 = new Interval(2,6);
Interval i3 = new Interval(8,10);
Interval i4 = new Interval(15,18);
ArrayList<Interval> a = new ArrayList<Interval>();
a.add(i1);
a.add(i2);
a.add(i3);
a.add(i4);
// for(Interval j :t.merge(a)){
// System.out.print(j);
// }
for(int i = 0;i<t.merge(a).size();i++){
System.out.println(t.merge(a).get(i).start+","+t.merge(a).get(i).end);
}
}
public ArrayList<Interval> merge(ArrayList<Interval> intervals) {
ArrayList<Interval> result = new ArrayList<Interval>();
if(intervals == null || intervals.size()<1){
return result;
}
int len = intervals.size();
int[] starts = new int[len];
int[] ends = new int[len];
//将每一个interval的首尾整数分别放置在两个数组中,尾部放置在end数组中
for(int i=0;i<len;i++){
starts[i] = intervals.get(i).start;
ends[i] = intervals.get(i).end;
}
//分别对两个数组进行排序
Arrays.sort(starts);
Arrays.sort(ends);
//将重叠的interval进行合并
for(int i =0,j=0;i<len;i++){
if(i==len-1 || starts[i+1] > ends[i]){
result.add(new Interval(starts[j],ends[i]));
j = i+1;
}
}
return result;
}
}