兩個區間的關係無非就下面幾種(這裡說的左端點是指下面那個區間的左右端點,內外指的是下面區間相較於上面區間的位置關係)
左端點:1.區間內 2.區間外
右端點:1.區間內 2.區間外
左1右1,左1右2,左2右1,左2右2
左2右1這種情況是不可能的,所以一共就3種可能的關係
|_____________|
1.|______|
2.|___________|
3. |___________|
針對3種不同的情況,需要做出不同的操作
所謂區間合併就是將所有存在交集(只有端點相等也算相交)的區間進行合併
我們始終維護乙個區間,在遍歷所有區間過程中,針對不同的情況做出不同的處理
上面情況1:我們維護的區間不發生變化,還是最上面的區間
情況2:維護的區間右端點需要擴大到此區間的右端點
情況3:和最上面的區間相比,不存在交集,所以維護區間的左右端點全部更新為當前區間的左右端點
// 將所有存在交集的區間合併
void merge(vector&segs)
); // 判斷的意義在於保證所有能夠進入答案的區間不是我們定義的初始區間
st = seg.first, ed = seg.second;
}else ed = max(ed, seg.second);
if (st != -2e9) res.push_back(); // 判斷的意義同上,這裡單獨處理一下是因為最後乙個區間或者只有乙個區間時無法進入答案
segs = res;
}
問題描述
給定 n 個區間 \([li,ri],\) 要求合併所有有交集的區間。輸入格式注意如果在端點處相交,也算有交集。
輸出合併完成後的區間個數。
例如:[1,3]和[2,6]可以合併為乙個區間[1,6]。
第一行包含整數n。輸出格式接下來n行,每行包含兩個整數 l 和 r。
共一行,包含乙個整數,表示合併區間完成後的區間個數。資料範圍
\(1 <= n <= 100000\)輸入樣例\(-10^9 <= l_i <= r_i <= 10^9\)
輸出樣例 解決**5
1 22 4
5 67 8
7 9
// 做法1:不真的進行區間合併,只是計數
#include #include #include using namespace std;
int n;
vector> segs;
int main()
); }
sort(segs.begin(), segs.end()); // sort對pair排序預設是首先按照第一關鍵字排序,之後按照第二關鍵字排序
int st = -2e9, ed = -2e9; // 初始值的設計很關鍵
int res = 0;
for (auto seg : segs)
else ed = max(ed, r); // 情況1和2
}cout << res << endl;
}// 做法2:真的把區間進行合併,然後計算區間個數
#include #include #include using namespace std;
int n;
vector> segs;
// 需要注意的是能夠放進答案的區間一會不能是我們定的初始區間,即if (st != -2e9)的必要性
void merge(vector> &segs)
); // 當遍歷到乙個沒有交集的區間時要把前乙個區間放進答案,但要看是不是初始值
st = l;
ed = r;
}else ed = max(ed, r);
}// 迴圈中把乙個區間放進答案的條件是出現新的無交集的區間,如果本身就乙個區間或者到最後乙個區間,迴圈中肯定不會把這個區間放進答案,所以需要單獨處理一下最後的乙個區間
if (st != -2e9) res.push_back(); // 因為segs中可能沒有區間
segs = res;
}int main()
); }
sort(segs.begin(), segs.end());
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 輸入 1,3 2,6 8,10 15,18 輸出 1,6 8,10 15,18 解釋 區間 1,3 和 2,6 重疊,將它們合併為 1,6 示例 2 輸入 1,4 4,5 輸出 1,5 解釋 區間 1,4 和 4,5 可被視為重疊區間。思路 先進行...