[java]代码库
package cn.rtdata.mq;
/*
*区间覆盖问题
*输入:n个区间,有可能重合,还有一个区间,判断这个区间是不是与这n个区间完全重合
*输出:true or false
*步骤:先将n个区间按start进行排序O(nlogn),然后根据这些区间的start和end将这些区间合并成为 互相不相交的区间O(n),然后判断给定区间是否与这些不相交的区间完全重叠
import java.util.*;
import cn.rtdata.DataSourceManager;
public class IntervalOverlap {
public static void main(String[] args) {
List<Interval> intervalList = new ArrayList<Interval>();
Interval i1 = new Interval(2, 3);
Interval i2 = new Interval(1, 2);
Interval i3 = new Interval(4, 9);
Interval i5 = new Interval(11, 15);
intervalList.add(i1);
intervalList.add(i2);
intervalList.add(i3);
intervalList.add(i5);
Interval i4 = new Interval(1, 6);
System.out.println(whetherOverlap(intervalList, i4));
}
public static List<Interval> intervalMerger(List<Interval> intervalList, Interval i,boolean add){
if(intervalList.size()==0||add){
intervalList.add(i);
//return intervalList;
}
Comparator<Interval> intervalComparator = new Comparator<Interval>() {
public int compare(Interval o1, Interval o2) {
long temp = o1.start-o2.start;
if(temp==0){
return 0;
}else if(temp>0){
return 1;
}else{
return -1;
}
}
};
Collections.sort(intervalList, intervalComparator);
for (int j = 0; j < intervalList.size() - 1; j++) {
Interval i1 = intervalList.get(j);
Interval i2 = intervalList.get(j + 1);
if (i1.end >= i2.start-1) {
i1.end = i2.end;
intervalList.remove(j + 1);
j--;
}
}
return intervalList;
}
/**
*区间是否在已有区间内
*/
public static boolean whetherOverlap(List<Interval> intervalList, Interval i) {
if(intervalList.size()==0)
return false;
intervalList = intervalMerger(intervalList,i,false);
for (int j = 0; j < intervalList.size(); j++) {
Interval interval = (Interval) intervalList.get(j);
if (interval.start <= i.start && interval.end >= i.end)
return true;
}
return false;
return true;
}
}
package cn.rtdata.mq;
import java.io.Serializable;
/**
*区间对象
*/
public class Interval implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
long start;
long end;
public Interval(long start, long end) {
this.start = start;
this.end = end;
}
}