package com.interview.books.question300;
import com.interview.leetcode.utils.Interval;
import java.util.Arrays;
import java.util.Comparator;
/**
* Created_By: stefanie
* Date: 14-12-16
* Time: 上午10:55
*/
public class TQ25_TargetIntervalSearcher {
static Comparator<Interval> comparator = new Comparator<Interval>() {
@Override
public int compare(Interval o1, Interval o2) {
if (o1.start < o2.start) return -1;
else if (o1.start > o2.start) return 1;
else return 0;
}
};
Interval[] source;
int length;
//O(NlgN)
public TQ25_TargetIntervalSearcher(Interval[] source){
this.source = source;
Arrays.sort(this.source, comparator);
length = merge(this.source);
}
//Time: O(N)
public int merge(Interval[] source){
if(source.length <= 1) return source.length;
int cur = 0;
Interval current = source[0];
for(int i = 1; i < source.length; i++){
if(source[i].start > current.end){ //no overlap
source[cur++] = current;
current = source[i];
} else {
current.end = Math.max(current.end, source[i].end); //update end
}
}
source[cur++] = current;
return cur;
}
public boolean isCover(Interval source, Interval target){
if(source.start <= target.start && source.end >= target.end) return true;
else return false;
}
public boolean cover(Interval target){
int low = 0;
int high = length - 1;
while(low <= high){
if(low == high) return isCover(source[low], target);
int mid = low + (high - low)/2;
if(isCover(source[mid], target)) return true;
else if(target.end < source[mid].start) high = mid - 1;
else if(target.start > source[mid].end) low = mid + 1;
else return false;
}
return false;
}
public static void main(String[] args){
Interval[] source = new Interval[]{new Interval(2,3), new Interval(1,2), new Interval(8,10), new Interval(4,6)};
//after merge: 1,3 4,6, 8,10
TQ25_TargetIntervalSearcher searcher = new TQ25_TargetIntervalSearcher(source);
System.out.println(searcher.cover(new Interval(1,6))) ; //false
System.out.println(searcher.cover(new Interval(1,3))) ; //true
System.out.println(searcher.cover(new Interval(5,6))) ; //true
System.out.println(searcher.cover(new Interval(9,10))); //true
}
}