package com.interview.flag.o;
import com.interview.basics.model.tree.BinarySearchTree;
import com.interview.leetcode.utils.Interval;
import java.util.Arrays;
import java.util.Comparator;
import java.util.PriorityQueue;
/**
* Created_By: stefanie
* Date: 15-2-3
* Time: 上午11:12
*/
public class O23_MostIntersectionInterval {
Comparator<Interval> sortComparator = new Comparator<Interval>() {
@Override
public int compare(Interval o1, Interval o2) {
if(o1.start == o2.start) return o1.end - o1.end;
else return o1.start - o2.start;
}
};
Comparator<Interval> heapComparator = new Comparator<Interval>() {
@Override
public int compare(Interval o1, Interval o2) {
if(o1.end == o2.end) return o1.start - o2.start;
else return o1.end - o2.end;
}
};
public int[] maxIntersection(Interval[] intervals){
int max = 0;
int[] interval = new int[3];
Arrays.sort(intervals, sortComparator);
PriorityQueue<Interval> heap = new PriorityQueue(intervals.length, heapComparator);
BinarySearchTree<Integer> passed = new BinarySearchTree();
for(int i = 0; i <= intervals.length; i++){
int end = i == intervals.length? Integer.MAX_VALUE : intervals[i].start;
while(!heap.isEmpty() && heap.peek().end < end){
Interval it = heap.poll();
int count = heap.size() + (passed.size() - passed.rank(it.start));
if(count > max){
max = count;
interval[0] = max;
interval[1] = it.start;
interval[2] = it.end;
}
passed.insert(it.end);
}
if(i < intervals.length){
heap.add(intervals[i]);
}
}
return interval;
}
public static void main(String[] args){
O23_MostIntersectionInterval finder = new O23_MostIntersectionInterval();
Interval[] intervals = new Interval[5];
intervals[0] = new Interval(0, 4);
intervals[1] = new Interval(1, 3);
intervals[2] = new Interval(4, 6);
intervals[3] = new Interval(2, 8);
intervals[4] = new Interval(5, 8);
int[] interval = finder.maxIntersection(intervals);
System.out.printf("Max overlap with %d other interval: (%d, %d)\n", interval[0], interval[1], interval[2]);
}
}