考虑一组日期范围:
A: [{2017/01/01, 2017/01/30},{2017/02/15, 2017/03/05},{2017/03/25, 2017/04/30}]
B: [{2017/01/01, 2017/01/30}]
C: [{2017/01/01, 2017/01/20},{2017/02/19, 2017/03/15}]
是否有一种有效的方法来计算“Outersection”间隔(阴影区域,A,B,C日期范围之间没有交叉点)?
编辑: @ kaidul-islam,谢谢你的回答!
我将逻辑简化为一个for
和一个if
:
...
for (i; i < n - 1; i++) {
var current := ranges[i];
var next := ranges[i + 1];
if (next.left > current.right) {
gap := next.left - right
if(gap > 0){
result.add(gap)
}
}
}
我错过了什么?
PS:范围按左右日期排序。
答案 0 :(得分:1)
按照左日期的升序排列所有范围集(A
,B
和C
)(左侧位置的日期较小的范围将首先出现)。< / p>
然后按照这个伪代码:
result = []
left := range[0].left
right := range[0].right
i := 0
while(i < n):
while(i + 1 < n && ranges[i + 1].left <= right):
right := max(ranges[i + 1].right, right)
i := i + 1
end
if(i + 1 < n):
gap := ranges[i + 1].left - right
if(gap > 0):
result.add(gap)
endif
endif
end
return result
时间复杂度O(nlogn)
用于排序,O(n)
用于从左到右扫描,其中n
是总计所有集合的范围总数。
如果您需要帮助,请告诉我。