building outline 问题及set, mutilset以及堆的一些理解

1扫描线法,需要考虑的就是当来一条竖线的时候,需要更新什么

2本例中,只需要考虑 是否更新当前最高高度的起点curX,是否产生一个输出。还有扫描线法固定的步骤:当起点来时候加进一个高度,当终点来时移除对应的高度。

3循环不变式:curX是当前outline的起点,堆里的最大高度就是当前outline的高度。当一个面来时:

1)堆是空的(没有建筑)进入一个outline, 记录curX

2) 当 新来的面坐标大于当前outline起点curX,且:

高度大于当前outline高度,

或者 高度等于当前outline高度,但是一个终点,且堆里面这个高度的建筑只剩下一个

当前outline结束,产生一个输出,更新curX

3)起点堆里加入建筑的高度,终点从堆里移除建筑高度

vector<vector<int> > buildingOutline(vector<vector<int> > &buildings) {
	if (buildings.empty()) return vector<vector<int>>();
	vector<vector<int>> sides;
	for (auto &b : buildings) {
		sides.push_back({ b[0], 0, b[2] });
		sides.push_back({ b[1], 1, b[2] });
	}
	sort(sides.begin(), sides.end());
	int x = 0;
	vector<vector<int>> res;
	multiset<int> q;
	for (auto &side : sides) {
		if (q.empty()) x = side[0];
		else {
			auto maxH = *q.rbegin();
			if (side[0] > x && (side[2] > maxH ||
				side[2] == maxH && side[1] == 1 && q.count(side[2]) == 1))
			{
				res.push_back({ x, side[0], maxH });
				x = side[0];
			}
		}
		if (side[1] == 0) q.insert(side[2]);
		else q.erase(q.find(side[2]));
	}
	return res;
}


关于set, multiset 和 堆

堆只是取最小值这一个操作是O(1)的,总体还是O(lgn)的。因为一般都是插入,查询,删除交织进行的。set可以删除任意元素,可以同时维护最大值最小值和任意第k大。

可以用set + 自己维护一个minValue变量实现堆(O(1)取最值)

multiset可以有重复,删除的时候注意用s.erase(s.find(key)),而不是s.erase(key),前者只删除一个,后者删除所有




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值