合并区间
约 10 分钟
把区间想成日程表上一段段被占用的时间。有些段挨着或重叠,就该并成一整段。做法:先按左端点(开始时间)从早到晚排好,再拿着当前这一段去看下一段——如果下一段的开始不晚于当前段的结束,说明它们粘在一起,就把结束时间取两者里较大的那个;否则另起一段。
#include <bits/stdc++.h>
using namespace std;
int main() {
vector<pair<int,int>> v = {{1,3},{2,5},{8,10}};
sort(v.begin(), v.end());
int l = v[0].first, r = v[0].second;
for (int i = 1; i < v.size(); i++) {
if (v[i].first <= r) r = max(r, v[i].second);
else { cout << l << " " << r << "\n"; l = v[i].first; r = v[i].second; }
}
cout << l << " " << r << "\n"; // 先输出 1 5,再输出 8 10
return 0;
}
常见错误:循环结束后忘了把最后攒着的那一段输出,结果少了一段。[1,3] 和 [2,5] 重叠,合并成 [1,5]。
小纸条
[1,3] 和 [2,5] 能合并吗?合并成什么?
登录 后可看答案