LeetCode218. The Skyline Problem分治法

该博客介绍了如何使用分治策略解决LeetCode218题——轮廓问题。通过不停对半分,当遇到空或大小为1的情况时停止,然后通过比较左右半部分的高度来合并结果。只有高度不同的点才能插入结果,并在某部分访问完后,将另一部分的点插入结果。
摘要由CSDN通过智能技术生成

题意:轮廓问题,不好描述。

首先怎么分:

  • 不停对半分
  • 停止条件1:为空时,直接返回空
  • 停止条件2:大小为1时,直接返回左上角点和右下角点。

那么怎么合并?

  • 维护两个变量:l,r l为左半部分当前位置,r为右半部分当前位置
  • 维护两个变量:h1,h2 h1表示左半部分当前位置高度,h2表示右半部分档期位置高度
  • 如果当前位置左半部分横坐标更小,就更新h1,从左半部分选元素;
  • 如果当前位置右半部分横坐标更小,就更新h2,从右半部分选元素;
  • 如果一样大,就更新h1,h2,从左(或右)半部分选元素
  • 当向结果中插入点时,只有和结果中最后一个点高度不同的点才能插入到结果里,且一直使用高度max(h1,h2)。
  • 当某一部分全部访问过后,就将另一部分(和结果中最后一个点高度不同的点)直接插入结果里。
#include <algorithm>

class Solution {
public:
    vector<pair<int, int>> getSkyline(vector<vector<int>>& buildings) {
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值