【题目】
给定一个N行3列二维数组,每一行表示有一座大楼,一共有N座大楼。
所有大楼的底部都坐落在X轴上,每一行的三个值(a, b, c)代表每座大楼的从(a, 0)点开始,到(b, 0)点结束,高度为c。
输入的数据可以保证 a < b, 且a,b,c均为正数。大楼之间可以有重合。 请输出整体的轮廓线。
例子:给定一个二维数组[[1, 3, 3], [2, 4, 4], [5, 6, 1]]
输出为轮廓线[[1, 2, 3], [2, 4, 4], [5, 6, 1]]
【题解】 [1, 2, 3]表示第1个数到第2个数的高度为3
[2, 4, 4]表示第2个数到第4个数的高度为4
将数组进行分解:
[1, 2, 3]分解为:[1, 3, 上][3, 3, 下]
然后将这些分解的数组按照第一个数进行排序从小到大
准备一个红黑树map, key为楼高 value为楼高值出现的次数
怎么知道是否产生轮廓了呢?
从初始化楼高0开始
当压入数据中为上者,则对相应楼高key值的value++
每压入一个数字,就查看map中的最高的楼高值【即map中最大的key】是否发生变化,
一旦发生变化了,则产生了轮廓,无论是上去还是下来
没有发生变化则没有产生轮廓
当压入数据为下,则对相应楼高key值的value--,value == 0则删除该条key记录
注意
当在同一个位置产生两条记录,比如在4的位置上有一个数据为下,和一个数据为上, 你在预处理数据进行排序时,谁前谁后?
一般是标记为下者排在前面,因为此时记录为楼高变下,那么前面一定有楼高变为上的
在压入数据时,要记录每个数位置的最大高度
【代码】
1 #pragma once 2 #include 3 #include