• 力扣(LeetCode)218. 天际线问题(2022.08.06)


    城市的 天际线 是从远处观看该城市中所有建筑物形成的轮廓的外部轮廓。给你所有建筑物的位置和高度,请返回 由这些建筑物形成的 天际线 。

    每个建筑物的几何信息由数组 buildings 表示,其中三元组 buildings[i] = [lefti, righti, heighti] 表示:

    lefti 是第 i 座建筑物左边缘的 x 坐标。
    righti 是第 i 座建筑物右边缘的 x 坐标。
    heighti 是第 i 座建筑物的高度。
    你可以假设所有的建筑都是完美的长方形,在高度为 0 的绝对平坦的表面上。

    天际线 应该表示为由 “关键点” 组成的列表,格式 [[x1,y1],[x2,y2],…] ,并按 x 坐标 进行 排序 。关键点是水平线段的左端点。列表中最后一个点是最右侧建筑物的终点,y 坐标始终为 0 ,仅用于标记天际线的终点。此外,任何两个相邻建筑物之间的地面都应被视为天际线轮廓的一部分。

    注意:输出天际线中不得有连续的相同高度的水平线。例如 […[2 3], [4 5], [7 5], [11 5], [12 7]…] 是不正确的答案;三条高度为 5 的线应该在最终输出中合并为一个:[…[2 3], [4 5], [12 7], …]

    示例 1:

    输入:buildings = [[2,9,10],[3,7,15],[5,12,12],[15,20,10],[19,24,8]]
    输出:[[2,10],[3,15],[7,12],[12,0],[15,10],[20,8],[24,0]]
    解释:
    图 A 显示输入的所有建筑物的位置和高度,
    图 B 显示由这些建筑物形成的天际线。图 B 中的红点表示输出列表中的关键点。
    示例 2:

    输入:buildings = [[0,2,3],[2,5,3]]
    输出:[[0,3],[5,0]]

    提示:

    1 <= buildings.length <= 104
    0 <= lefti < righti <= 231 - 1
    1 <= heighti <= 231 - 1
    buildings 按 lefti 非递减排序

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/the-skyline-problem

    方法一:扫描线+优先队列

    C++提交内容:

    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)> que(cmp);
    
            vector<int> boundaries;
            for (auto& building : buildings) {
                boundaries.emplace_back(building[0]);
                boundaries.emplace_back(building[1]);
            }
            sort(boundaries.begin(), boundaries.end());
    
            vector<vector<int>> ret;
            int n = buildings.size(), idx = 0;
            for (auto& boundary : boundaries) {
                while (idx < n && buildings[idx][0] <= boundary) {
                    que.emplace(buildings[idx][1], buildings[idx][2]);
                    idx++;
                }
                while (!que.empty() && que.top().first <= boundary) {
                    que.pop();
                }
    
                int maxn = que.empty() ? 0 : que.top().second;
                if (ret.size() == 0 || maxn != ret.back()[1]) {
                    ret.push_back({boundary, maxn});
                }
            }
            return ret;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
  • 相关阅读:
    前端JavaScript入门到精通,javascript核心进阶ES6语法、API、js高级等基础知识和实战 —— Web APIs(六)
    Compose预处理组件大比拼:性能、应用场景和可视化对比总结
    某车联网App 通讯协议加密分析
    Golang链路追踪:实现高效可靠的分布式系统监控
    (二)实现Bean属性依赖注入功能【手撸Spring】
    2022-09-08 mysql/stonedb-慢SQL-出现问题的SQL-Q2
    帆软报表日常操作记录
    博弈论——斯塔克尔伯格模型(Stackelberg model)
    Spring事务之@Transactional注解详解
    2023年中国自动驾驶卡车市场发展趋势分析:自动驾驶渗透率快速增长[图]
  • 原文地址:https://blog.csdn.net/ChaoYue_miku/article/details/126203465