演算法 合併計算區間問題

2022-07-03 10:54:08 字數 1423 閱讀 1997

一維的區間合併計算問題種類很多,但是都是乙個套路,起點排序,在這裡做乙個彙總。

給出乙個區間的集合,請合併所有重疊的區間。

leetcode

解題思路:先根據起點進行排序,再遍歷陣列,然後用乙個指標獲取當前區間:

class solution  else 

}// 新增最後的答案

res.add(cur);

return res.toarray(new int[res.size()]);

}}

給出乙個無重疊的 ,按照區間起始端點排序的區間列表。

在列表中插入乙個新的區間,你需要確保列表中的區間仍然有序且不重疊(如果有必要的話,可以合併區間)。

leetcode

解題思路:將插入的區間直接新增進去,就是和上一題一摸一樣了。但是題目給的區間集合是有序無重疊的,如果選擇新增之後再排序,其實就不符合出題者的意圖,時間複雜度也將是nlogn的。

因此我們應該好好利這個條件,即有序無重疊的。同樣也可以利用上一題的思路,進行分類討論:

這樣做就不會浪費多餘的空間,時間複雜度也是線性的。其實可以考慮二分的做法,快速獲取第乙個存在交集的區間。

class solution  else if(i[0] > cur[1])  else 

}// 新增最後的區間

res.add(cur);

return res.toarray(new int[res.size()]);

}}

在二維空間中有許多球形的氣球。對於每個氣球,提供的輸入是水平方向上,氣球直徑的開始和結束座標。由於它是水平的,所以縱座標並不重要,因此只要知道開始和結束的橫座標就足夠了。開始座標總是小於結束座標。

一支弓箭可以沿著 x 軸從不同點完全垂直地射出。在座標 x 處射出一支箭,若有乙個氣球的直徑的開始和結束座標為 xstart,xend, 且滿足 xstart ≤ x ≤ xend,則該氣球會被引爆。可以射出的弓箭的數量沒有限制。 弓箭一旦被射出之後,可以無限地前進。我們想找到使得所有氣球全部被引爆,所需的弓箭的最小數量。

給你乙個陣列 points ,其中 points [i] = [xstart,xend] ,返回引爆所有氣球所必須射出的最小弓箭數。

leetcode

解題思路:先排序,出現相交的區間,這裡需要將指標區間變成交集,而不是並,然後再將答案加一,如果出現不相交區間,就更新當前指標區間。

class solution  else 

}return res;

}}

解題思路:先排序,出現相交的區間,就合併區間,如果出現不相交區間,就更新當前指標區間,並將答案加一。

區間合併演算法

問題 對輸入的區間如 1,2 2,6 3,5 7,9 進行合併,輸出 1,6 7,9 思路1 如果資料較小,可開闢一大陣列,如上述資料,開闢乙個大小為100的布林型陣列對在區間內的賦值true。掃瞄輸出為true的數字。思路2 定義left和right,1 開始left和right分別為第乙個區間的...

演算法(區間合併)

給定 n 個區間 li,ri 要求合併所有有交集的區間。注意如果在端點處相交,也算有交集。輸出合併完成後的區間個數。例如 1,3 和 2,6 可以合併為乙個區間 1,6 輸入格式 第一行包含整數n。接下來n行,每行包含兩個整數 l 和 r。輸出格式 共一行,包含乙個整數,表示合併區間完成後的區間個數...

區間合併演算法

兩個區間的關係無非就下面幾種 這裡說的左端點是指下面那個區間的左右端點,內外指的是下面區間相較於上面區間的位置關係 左端點 1.區間內 2.區間外 右端點 1.區間內 2.區間外 左1右1,左1右2,左2右1,左2右2 左2右1這種情況是不可能的,所以一共就3種可能的關係 1.2.3.針對3種不同的...