问题:
Given a collection of intervals, merge all overlapping intervals.
For example,
Given [1,3],[2,6],[8,10],[15,18]
,
return [1,6],[8,10],[15,18]
.
解决:
① 先将区间按照每个start的值来排序,排好序以后判断一个区间的start值是否处在前一个区间中,如果在前一个区间中,那么合并;如果不在,就将新区间添加。
/**
* Definition for an interval.
* public class Interval {
* int start;
* int end;
* Interval() { start = 0; end = 0; }
* Interval(int s, int e) { start = s; end = e; }
* }
*/
public class Solution { //28ms
public List<Interval> merge(List<Interval> intervals) {
List<Interval> res = new ArrayList<>();
if(intervals.size() == 0)
return res;
// 根据start将区间排序,重载外部比较器
Collections.sort(intervals, new Comparator<Interval>(){
public int compare(Interval a, Interval b){
return a.start - b.start;
}
});
// 获取第一个区间
Interval temp = intervals.get(0);
// 如果只有一个区间
if(intervals.size() == 1){
res.add(temp);
return res;
}
// 从第一个开始遍历区间
for(int i = 1; i < intervals.size(); i ++){
// case 1: 如果temp.end >= intervals.get(i).start,表明两区间重合,更新temp的end为max(tempEnd, thisEnd)
if(temp.end >= intervals.get(i).start){
temp.end = Math.max(temp.end, intervals.get(i).end);
}
// case 2: 两个区间没有重合
else{
res.add(temp);
temp = intervals.get(i);
}
}
//将最后一个区间加入到链表中
res.add(temp);
return res;
}
}
② 将start和end分别提取出来,然后进行排序并且分类。
/**
* Definition for an interval.
* public class Interval {
* int start;
* int end;
* Interval() { start = 0; end = 0; }
* Interval(int s, int e) { start = s; end = e; }
* }
*/
class Solution { //17ms
public List<Interval> merge(List<Interval> intervals) {
int len = intervals.size();
int[] starts = new int[len];
int[] ends = new int[len];
List<Interval> res = new ArrayList<>();
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);
for(int i = 0,j = 0;i < len;i ++){
if(i == len - 1 || starts[i + 1] > ends[i]){
res.add(new Interval(starts[j],ends[i]));
j = i + 1;
}
}
return res;
}
}
【注】java 两种比较器Comparator 和 Comparable
public class CompareTest {
public static void main(String[] args) {
List<Student> list=new ArrayList<Student>(10);
list.add(new Student(1,"jj"));
list.add(new Student(0,"ww"));
list.add(new Student(0,"kk"));
list.add(new Student(2,"ll"));
Collections.sort(list); //内部比较器:要排序的对象实现Comparable接口,可以对自身进行比较
System.out.println(list);
List<Teacher> t=new ArrayList<Teacher>(10);
t.add(new Teacher(1,12));
t.add(new Teacher(0,13));
t.add(new Teacher(0,14));
t.add(new Teacher(2,15));
Collections.sort(t,new StudentComparator()); //外部比较器:通过实现Comparator接口
System.out.println(t);
}
}
class Student implements Comparable {
int num;
String name;
public Student(int num, String name) {
this.num = num;
this.name = name;
}
@Override
public String toString() {
return "\r\tnum:"+num+" name:"+name+"\r";
}
public int compareTo(Object o) {
Student tmp=(Student) o;
int result=tmp.num>num?1:(tmp.num==num?0:-1);
if (result==0) {
result=tmp.name.indexOf(0)>name.indexOf(0)?1:-1;
}
return result;
}
}
class Teacher{
int num;
double salary;
public Teacher(int num, double salary) {
this.num = num;
this.salary = salary;
}
@Override
public String toString() {
return "\r\tnum:"+num+" salary:"+salary+"\r";
}
}
class StudentComparator implements Comparator{
public int compare(Object o1, Object o2) {
Teacher t1=(Teacher) o1;
Teacher t2=(Teacher) o2;
int result=t1.num>t2.num?1:(t1.num==t2.num?0:-1);
return result=result==0?(t1.salary<t2.salary?1:-1):result;
}
}