LeetCode 218. 天际线问题 (扫描线+优先队列)
先把所有横坐标排序,然后把建筑按横坐标排序。设定每个建筑都包含左不包含有 [left,right) 这样。然后对于每一个横坐标都先在优先队列压入包含它的建筑
然后再从最高的点开始找,如何不包含该横坐标就弹出。然后剩下的建筑中,都是包含该横坐标的,找最高的那个就是关键点。
要学习一下优先队列自定义排序的写法。
class Solution { public: vector<vector<int>> getSkyline(vector<vector<int>>& buildings) { // 优先队列保存当前最大高度 // 优先队列 按高度排序 auto cmp = [](const pair<int, int>& a, const pair<int, int>& b) -> bool { return a.second < b.second; }; priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(cmp)> q(cmp); vector<int> boundaries; // 保存所有横坐标 for (auto &b: buildings) { boundaries.push_back(b[0]); boundaries.push_back(b[1]); } sort(boundaries.begin(), boundaries.end()); // 横坐标从小到达排序 // buildings 按 lefti 非递减排序 不需要再次排序 vector<vector<int>> ret; int n = buildings.size(), idx = 0; for (auto & b: boundaries) { while (idx < n && buildings[idx][0] <= b) { q.emplace(buildings[idx][1], buildings[idx][2]); idx++; } while (!q.empty() && q.top().first <= b) { q.pop(); } int maxh = q.empty() ? 0 : q.top().second; if (ret.empty() || maxh != ret.back()[1]) { ret.push_back({b, maxh}); } } return ret; } };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架