$$\color{red}{算法}\color{blue}{基础课}\color{purple}{笔记and题解}\color{green}{汇总}$$
笔记:
区间合并我觉得挺好理解的。
给定$n$个区间,合并所有有交集的区间,求合并后的区间数量。
1. 按照左端点排序($struct$结构体)
2. 相邻的区间是可能可以合并的,那么当且仅当:$l_j <= r_i$。
3. 如果可以合并,那么更新:$r_i=max(r_i,r_j)$
代码:
#include <bits/stdc++.h>
using namespace std;
int n, cnt = 0;
struct S {
int l, r;
} a[100010], ans[100010];
int cmp(S a, S b) {
if (a.l == b.l) return a.r < b.r;
return a.l < b.l;
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%d%d", &a[i].l, &a[i].r);
sort(a + 1, a + 1 + n, cmp);
ans[++cnt] = a[1];
for (int i = 2; i <= n; i++)
if (a[i].l <= ans[cnt].r) ans[cnt].r = max(ans[cnt].r, a[i].r);
else ans[++cnt] = a[i];
cout << cnt;
return 0;
}
为啥其他题解都写的好复杂,我还以为我一开始的 AC 代码写假了/kk
只要能AC就是好算法
只要能在AC之后优化时空复杂度的就是顶尖算法hh
我感觉其他的题解不会复杂呀
事实上是看完我的解法和题解的代码感觉到了明显的差异,感觉您的最好理解hh
Orz谢谢hh
结构体排序?还能这么做?
好清晰的思路和解法