前言:本文就以堆排序的方式解决线段重合问题作简单介绍
参考视频:左程云--算法讲解027
题目链接:牛客--线段重合
题目详情:
解题思路:
①创建线段结构,含两个int值表示两端,循环得到数据,构建线段数组
②将线段数组以第一个元素进行升序排序(sort)
③构建存放整型变量的小根堆
④遍历线段数组,以每个数组为焦点
⑤循环判断,如果堆顶小于当前线段的左端(即认为对于线段不可能重叠),弹出堆顶
⑥当前线段的右段入堆,供之后的线段判断
⑦更新结果,重复步骤④
⑧遍历线段数组后输出结果
代码示例:
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
const static int N = 10001;
struct Pair {
int l, r;
};
vector<Pair> lines(N);
//(a, b) -> true : a < b
bool compare(const Pair& a, const Pair& b) {
return a.l < b.l;
}
struct compareInt {
bool operator()(int a, int b){
return a > b;
}
};
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; ++i) {
cin >> lines[i].l >> lines[i].r;
}
sort(lines.begin(), lines.begin() + n, compare);
priority_queue<int, vector<int>, compareInt> pq;
int ans = 0;
for (int i = 0; i < n; i++) {
//lines[i] -> Pair
while (!pq.empty() && pq.top() <= lines[i].l) {
pq.pop();
}
pq.push(lines[i].r);
int k = pq.size();
ans = max(ans, k);
}
cout << ans << endl;
return 0;
}
学习总结:
①sort的排序方式改写,使用自定义方法,两个类型比较,true则不变,false则交换。例如,如果想要数组升序,(a, b)如果返回 true 则表示a < b。对整型数组可简单记为升序小于,降序大于。
②使用优先队列改写优先级规则时,定义struct并重载运算符()。两个类型比较,true表示(a, b)中b的优先级高,对整型数组可简单记为,小根堆大于,大根堆小于。