博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法:大楼轮廓问题
阅读量:4060 次
发布时间:2019-05-25

本文共 360 字,大约阅读时间需要 1 分钟。

每栋楼有左边界L,右边界R,高度H,现在有N栋楼,有可能相互遮挡,问每个坐标最大高度是?

线段树 or 有序表 ? 时间O(NlogN)

线段树:

初始叶节点为0,非叶节点置为0x1000,一个负数表示未处理,[L,R]边界更新线段树节点最大值。
输出时,线段树求解[0,N-1],若为负数,则找子节点,直到某个区间找到一个非0的数。

有序表:

所有楼按左边界,右边界拆分成两种记录,(坐标loc,高度H,状态),其中状态分为,加入 or 删除,所有左节点为加入状态,所有右节点为删除状态。

将所有记录按坐标排序。

从0开始遍历每个坐标,同时,维护另一个有序表,结构为(高度,次数),表示高度H出现了几次。

然后加入 or 删除 状态就是对这个有序表进行添加或减少。

由于有序表的特性,可以O(1)获得当前坐标最大高度。

转载地址:http://ebwji.baihongyu.com/

你可能感兴趣的文章
1.3 Debugging of Shaders (调试着色器)
查看>>
关于phpcms中模块_tag.class.php中的pc_tag()方法的含义
查看>>
linux安装usb wifi接收器
查看>>
多线程使用随机函数需要注意的一点
查看>>
getpeername,getsockname
查看>>
VS 2005 CRT函数的安全性增强版本
查看>>
Visual Studio 2010:C++0x新特性
查看>>
drwtsn32.exe和adplus.vbs进行dump文件抓取
查看>>
cppcheck c++静态代码检查
查看>>
在C++中使用Lua
查看>>
socket编程中select的使用
查看>>
所谓的进步和提升,就是完成认知升级
查看>>
长文干货:如何轻松应对工作中最棘手的13种场景?
查看>>
如何用好碎片化时间,让思维更有效率?
查看>>
No.174 - LeetCode1305 - 合并两个搜索树
查看>>
No.175 - LeetCode1306
查看>>
No.182 - LeetCode1325 - C指针的魅力
查看>>
mysql:sql alter database修改数据库字符集
查看>>
mysql:sql truncate (清除表数据)
查看>>
yuv to rgb 转换失败呀。天呀。谁来帮帮我呀。
查看>>