我们有一些区间,例如 [1;4] [7;13] [9;14] ,输入应该返回 3+6+1=10。
当这些区间可以动态插入或删除时,是否有使用线段树的方法来找到这些区间的总长度?
附言:我想过不使用线段树来完成,但时间复杂度不能满足我的需求。
提前感谢您。
附言:我想过不使用线段树来完成,但时间复杂度不能满足我的需求。
提前感谢您。
int totalIntervales = 0;
for(int index = 0; index < array.length ; index++)
{
int currentIntrval = array[index, 1] - array[index, 0];
int differnceFromPrevious = array[index, 1] - array[index- 1, 1]
totalIntervale += currentIntrval > differnceFromPrevious ? differnceFromPrevious : currentIntrval;
}
return totalIntervale;
仅需小心处理位置0。
Kobi/Maureinik的答案非常接近,但我必须添加一个maxEnd变量,并检查differenceFromPrevious是否为非负数。该算法仍然假定范围按起始元素(即array [i,0])排序。
int totalInterval = array[0, 1] - array[0, 0];
int maxEnd = array[0, 1];
for(int index = 1; index < array.length ; index++) {
int currentIntrval = array[index, 1] - array[index, 0];
int differnceFromPrevious = array[index, 1] - maxEnd;
if(differenceFromPrevious >= 0) {
totalInterval += (currentIntrval > differnceFromPrevious) ? differnceFromPrevious : currentIntrval;
}
maxEnd = (maxEnd >= array[index, 1]) ? maxEnd : array[index, 1];
}
return totalInterval;
编辑:修复了意外复制原始totalInterval逻辑的错误。如果differenceFromPrevoius < 0,则应保持totalInterval不变。