package com.interview.algorithms.general;
import com.interview.utils.models.Range;
import java.util.Arrays;
import java.util.Comparator;
/**
* Created with IntelliJ IDEA.
* User: stefanie
* Date: 9/24/14
* Time: 3:50 PM
*
* Solution:
* 1. sort the target ranges using start. O(NlgN)
* 2. combine the range when next start < previous end. O(N)
* 3. binarysearch on the combined range, if source is covered. O(N)
* for optimize if need binarysearch several times: could build an IntervalBSTSearcher O(lgN)
*/
public class C1_63_RangeCheck {
public static boolean cover(Range source, Range[] target){
Arrays.sort(target, new Comparator<Range>() {
@Override
public int compare(Range o1, Range o2) {
if(o1.start < o2.start) return -1;
else if(o1.start > o2.start) return 1;
else return 0;
}
});
int cur = 0;
for(int i = 1; i < target.length; i++){
if(target[i].start <= target[cur].end && target[i].end > target[cur].end)
target[cur].end = target[i].end;
else cur = i;
}
cur = 0;
for(int i = 0; i < target.length; i++){
if(i == 0 || target[i].end > target[cur].end)
if(Range.cover(source, target[i])) return true;
else cur = i;
}
return false;
}
}