此代码返回重叠坐标。 示例:输入[10,30] [20,50] [40,70,] [60,90] [80,100] 答案应该是:[20,30],[40,50] [60,70] [80,90] 有没有办法以低于二次时间复杂度来解决这个问题?
谢谢,
public static Set<OverlapCoord> getOverlap(List<Interval> intervalList) {
if (intervalList == null) {
throw new NullPointerException("Input list cannot be null.");
}
final HashSet<OverlapCoord> hashSet = new HashSet<OverlapCoord>();
for (int i = 0; i < intervalList.size() - 1; i++) {
final Interval intervali = intervalList.get(i);
for (int j = 0; j < intervalList.size(); j++) {
final Interval intervalj = intervalList.get(j);
if (intervalj.getStart() < intervali.getEnd() && intervalj.getEnd() > intervali.getStart() && i != j) {
hashSet.add(new OverlapCoord(Math.max(intervali.getStart(),intervalj.getStart()),
Math.min(intervali.getEnd(), intervalj.getEnd())));
}
}
}
return hashSet;
}
答案 0 :(得分:0)
您应该能够通过对间隔数组进行排序(按间隔起点排序)将其减少到O(NlogN)
,然后在比较连续间隔时迭代它。
我怀疑O(NlogN)
可能做得更好,除非您可以分摊多次运行的分拣步骤的成本。
请注意,如果一个间隔可以重叠多个其他间隔,则此一般方法将起作用。但是如果你想枚举每个重叠,那么在最坏的情况下可能会有O(N^2)
个重叠,因此算法必须是O(N^2)
。
(例如,在“[1,2],[1,2],[1,2],[1,2]”中,每个区间重叠所有其他区域,给出6个重叠...或者12个,如果你不要消除对称对。)