zoukankan      html  css  js  c++  java
  • 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;
        }
    };
    
  • 相关阅读:
    第6天c#基础结构体和数组
    第5天c#基础for循环和enum
    第4天c#基础switch和while循环
    第3天c#按位运算和增减buff
    第2天c#基础
    第1天c#基础语法
    背景图层填充底色调密度
    如何在运行里添加命令
    网站
    BAT设置
  • 原文地址:https://www.cnblogs.com/joelwang/p/12021372.html
Copyright © 2011-2022 走看看