例如[1; 4] [7; 13] [9; 14]的輸入應該返回3 + 6 + 1 = 10。 有什麼方法可以動態地插入或刪除間隔時,使用分段樹來查找這些間隔的總長度?使用分段樹查找重疊區間的總長度?
P.S .:我想這樣做,而不使用分段樹,但時間複雜性不滿足我。
預先感謝您
例如[1; 4] [7; 13] [9; 14]的輸入應該返回3 + 6 + 1 = 10。 有什麼方法可以動態地插入或刪除間隔時,使用分段樹來查找這些間隔的總長度?使用分段樹查找重疊區間的總長度?
P.S .:我想這樣做,而不使用分段樹,但時間複雜性不滿足我。
預先感謝您
讓我們假設該間隔被存儲在陣列[M,N]英寸 另一個假設是數組被排序。
所有你需要做的是找到更小的差異:
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是否定的。該算法仍然假定範圍的起始元件上的排序
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;
編輯(即陣列[I,0]):原始totalInterval邏輯的固定意外拷貝沒有工作。如果differenceFromPrevoius < 0,則應該單獨保留totalInterval。
你有多少間隔和最大的最小位置和iterval的長度。有多少請求獲得總數,多少插入? –
是按照你的例子排序的區間? –
@AndyT是我可以先排序他們 – CoderInNetwork