classSolution { public: vector<vector<int>> merge(vector<vector<int>>& intervals) { sort(intervals.begin(), intervals.end());//排序 int st = -1, ed = -1;//在所有区间范围左边 vector<vector<int>> ans; for (auto seg : intervals) { if (ed < seg[0]) {//区间不相交 if (st != -1) ans.push_back({st, ed});//跳过哨兵区间 st = seg[0];//更新左端点 } ed = max(seg[1], ed); //更新右端点 } if(st != -1) ans.push_back({st, ed});//加入最后维护的区间,特判输入不为空 return ans; } };
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
classSolution { public: vector<vector<int>> merge(vector<vector<int>>& a) { vector<vector<int>> res; sort(a.begin(), a.end()); int l = a[0][0], r = a[0][1]; for (int i = 1; i < a.size(); i ++ ) { if (r < a[i][0]) { res.push_back({l, r}); l = a[i][0], r = a[i][1]; } else r = max(r, a[i][1]); } res.push_back({l, r}); return res; } };
classSolution { public: vector<vector<int>> insert(vector<vector<int>>& a, vector<int>& b) { vector<vector<int>> ans; int n = a.size(), i = 0; while (i < n && a[i][1] < b[0]) ans.push_back(a[i++]); if (i < n) { b[0] = min(a[i][0], b[0]);//更新左端点 while (i < n && a[i][0] <= b[1]) b[1] = max(b[1], a[i++][1]);//若重叠则更新右端点 } ans.push_back(b); while (i < n) ans.push_back(a[i++]); return ans; } };
#include<iostream> #include<algorithm> usingnamespace std; using PII = pair<int,int>; constint N = 1e5 + 10; PII range[N]; intmain(){ int n; cin >> n; for (int i = 0; i < n; ++i) { int a, b; cin >> a >> b; range[i] = {a, b}; } sort(range, range + n,[&](const PII& a, const PII& b) {return a.second < b.second;}); int ans = 0; for (int i = 0, ed = -2e9; i < n; ++i) { if (ed < range[i].first) { ++ans; ed = range[i].second; } } cout << ans; return0; }
#include<iostream> #include<algorithm> usingnamespace std; constint N = 1e5 + 10; structRange{ int l, r; booloperator< (const Range& R) { return l < R.l; } }range[N]; intmain(){ int n; cin >> n; for (int i = 0; i < n; ++i) { int a, b; cin >> a >> b; range[i] = {a, b}; } sort(range, range + n); int ans = 0; for (int i = 0, ed = -2e9; i < n; ++i) { if (ed < range[i].l) {//不相交 ++ans; ed = range[i].r; } else { ed = min(ed, range[i].r);//因为是按左端点排序的,当前区间右端点不一定在上一区间右端点后面,可能不包含选择点(即上一区间右端点),需要回退 } } cout << ans; return0; }
#include<iostream> #include<algorithm> usingnamespace std; using PII = pair<int,int>; constint N = 1e5 + 10; PII range[N]; intmain(){ int n; cin >> n; for (int i = 0; i < n; ++i) { int a, b; cin >> a >> b; range[i] = {a, b}; } sort(range, range + n, [](const PII &a, const PII &b) {return a.second < b.second;}); int ans = 0; for (int i = 0, ed = -2e9; i < n; ++i) { if (ed < range[i].first) { ans++; ed = range[i].second; } } cout << ans; return0; }