package com.interview.algorithms.general;
import com.interview.utils.models.Range;
import java.util.*;
/**
* Created_By: stefanie
* Date: 14-6-23
* Time: 下午8:44
*
* Given a set of ranges, find the two ranges with the greatest overlap.
*
* Solution:
* when the ranges are sorted by start as r1, r2, r3, etc...
* a. when r1.end < r2.end: the overlap of (r1,r3) can be no larger than (r2,r3)
* r1 ---------------------------- r1
* r2 ----------------------------- r2
* r3 ---------- r3 ------ r3 ------- r3 (r1,r3) < (r2,r3) when r1.end < r2.end
*
* b. when r1.end > r2.end: the overlap of (r2,r3) can be no larger than (r1,r3)
* r1 ------------------------------- r1
* r2 -------------- r2
* r3 ---- r3 ---- r3 --------- r3 (r2,r3) < (r1,r3) when r1.end > r2.end
*
* so the max overlap always goes to (max_end, r3), so keep tracing the max_end
*/
public class C1_10_GreatestOverlap {
static class MaxOverlapRange{
public Range r1;
public Range r2;
public int overlap = 0;
}
public static MaxOverlapRange getGreatestOverlap(List<Range> ranges) {
Collections.sort(ranges, new Comparator<Range>() {
@Override
public int compare(Range range1, Range range2) {
return range1.start > range2.start ? 1 : -1;
}
});
Iterator<Range> rangesItr = ranges.iterator();
// initialize result
MaxOverlapRange maxOverlap = new MaxOverlapRange();
Range current = rangesItr.next();
while(rangesItr.hasNext()) {
Range next = rangesItr.next();
int overlap = getOverlap(current, next);
if(overlap > maxOverlap.overlap) {
maxOverlap.r1 = current;
maxOverlap.r2 = next;
maxOverlap.overlap = overlap;
}
if(next.end > current.end)
current = next;
}
return maxOverlap;
}
private static int getOverlap(Range r1, Range r2) {
if(r2.end <= r1.end)
return r2.end - r2.start;
if(r2.start >= r1.end)
return 0;
return r1.end - r2.start;
}
}