基礎演算法 區間合併

2021-10-02 17:09:56 字數 1153 閱讀 4072

概念:給我們很多區間,如果有交集的區間(如果在端點處相交也算),我們可以將他們合併城乙個區間。

1、按區間左端點從小到大排序。

2、  總共有三種情況:

給定 nn 個區間 [li,ri][li,ri],要求合併所有有交集的區間。

注意如果在端點處相交,也算有交集。

輸出合併完成後的區間個數。

例如:[1,3]和[2,6]可以合併為乙個區間[1,6]。

輸入格式

第一行包含整數n。

接下來n行,每行包含兩個整數 l 和 r。

輸出格式

共一行,包含乙個整數,表示合併區間完成後的區間個數。

資料範圍

1≤n≤1000001≤n≤100000,

−109≤li≤ri≤109−109≤li≤ri≤109

輸入樣例:

5

1 22 4

5 67 8

7 9

輸出樣例:

3
#include #include #include using namespace std;

typedef pairpii;

const int n = 100010;

int n;

vectorsegs;

void merge(vector&segs)

);

st = seg.first, ed = seg.second;

}//2、當前區間和維護區間有交集,則求並集

else ed = max(ed, seg.second);//求ed與seg.second的max

if (st != -2e9) res.push_back();//防止輸入陣列是空的

segs = res;//把區間更新到res

}int main()

); }

merge(segs);//區間合併

cout << segs.size() << endl;//返回合併序列長度

return 0;

}

區間合併演算法

問題 對輸入的區間如 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種不同的...