The Skyline Problem解题报告

https://leetcode.com/problems/the-skyline-problem/

这道题是根据数据对勾勒出数据的外形。数据的外形只和左边线和高度有关。因为数据已经按照左边线做了升序处理,所以我们不需要考虑序列的问题。外部的轮廓有所改变会出现两种情况:一是出现拐点,在一片相交连续的区域内有高度不同。二是出现空隔,空隔是将要开始扫描的左边线比已经存储右边线还要大,这时出现空隔。因此我们使用priority_queue数据结构存储已经使用过的建筑的高度和右边线。当当前建筑有交集高度变化则将该建筑插入priority_queue中,否则将queue清空,重新开始。

class Solution {
public:
    vector<pair<int, int>> getSkyline(vector<vector<int>>& buildings) {
        vector<pair<int, int>> res;
        if(buildings.size()==0) return res;
        priority_queue<pair<int,int> > livbld;
        int cur=0;
        int curX=-1,curH=-1,len=buildings.size();
        while(cur<len||!livbld.empty()){
            curX=livbld.empty()?buildings[cur][0]:livbld.top().second;
            if(cur>=len||buildings[cur][0]>curX){
                while(!livbld.empty()&&(livbld.top().second<=curX)) livbld.pop();
            }
            else{
                curX=buildings[cur][0];
                while(cur<len&&buildings[cur][0]==curX){
                    livbld.push(make_pair(buildings[cur][2], buildings[cur][1]));
                    cur++;
                }
            }
            curH=livbld.empty()?0:livbld.top().first;
            if(res.empty() || (res.back().second != curH) ) res.push_back(make_pair(curX, curH));
        }
        return res;
    }
};


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值