• leetcode218 天际线问题


    来自leetcode题解:扫描线法AlgsCG

    class Solution {
    public:
        vector<vector<int>> getSkyline(vector<vector<int>>& buildings) {
            vector<pair<int,int>> h;
            multiset<int> m;
            vector<vector<int>> res;
    
            //采用从左到右扫描的思想来做;
            //1、将每一个建筑分成“两个部分”,例如:[2,9,10]可以转换成[2,-10][9,10],我们用负值来表示左边界
            for(const auto& b:buildings)
            {
                h.push_back({b[0], -b[2]});
                h.push_back({b[1], b[2]});
            }
    
            //2、根据x值对分段进行排序
            sort(h.begin(),h.end());
            int prev = 0, cur = 0;
            m.insert(0);
    
            //3、遍历
            for (auto i:h)
            {
                if (i.second < 0) m.insert(-i.second);  //左端点,高度入堆
                else m.erase(m.find(i.second));         //右端点,高度出堆
                cur = *m.rbegin();                      //还在当前扫描坐标内的当前最大高度
                if (cur != prev) {                      //当前最大高度不等于最大高度perv表示这是一个转折点
                    res.push_back({i.first, cur});      //添加坐标
                    prev = cur;                         //更新最大高度
                }
            }
            return res;
        }
    };
    
  • 相关阅读:
    性能分析与调优思想
    python散列实现映射抽象数据类型
    python接口模拟100个用户登录
    大O记法
    linux查看操作系统版本信息
    Python招聘信息
    flask-login模块官网内容整理
    python|base|环境搭建
    echarts|map
    mysql|unsigned 与 signed 类型
  • 原文地址:https://www.cnblogs.com/joelwang/p/12021372.html
Copyright © 2020-2023  润新知