合并区间

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] 能合并吗?合并成什么?

登录 后可看答案

合并区间 · C++ 入门 · op599 课程