数据结构与算法——线段重合

前言:本文就以堆排序的方式解决线段重合问题作简单介绍
参考视频:左程云--算法讲解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的优先级高,对整型数组可简单记为,小根堆大于,大根堆小于。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值