11import java .util .ArrayList ;
22import java .util .Arrays ;
33import java .util .Comparator ;
4- import java .util .HashMap ;
4+ import java .util .HashSet ;
55import java .util .List ;
6- import java .util .Map ;
6+ import java .util .Set ;
77import java .util .TreeSet ;
88
99public class Solution218 {
10+ // 28ms
1011 public List <List <Integer >> getSkyline (int [][] buildings ) {
1112 // 按高度由低到高排序
1213 Arrays .sort (buildings , Comparator .comparingInt (o -> o [2 ]));
@@ -137,33 +138,19 @@ private void pushUp(Node node) {
137138 }
138139 }
139140
141+ // 15ms
140142 public List <List <Integer >> getSkyline2 (int [][] buildings ) {
141143 Arrays .sort (buildings , Comparator .comparingInt (o -> o [2 ]));
142-
143144 // 离散化
144- TreeSet <Integer > treeSet = new TreeSet <>();
145- for (int [] building : buildings ) {
146- treeSet .add (building [0 ]);
147- treeSet .add (building [1 ]);
148- }
149- int idx = 1 ;
150- List <Integer > list = new ArrayList <>();
151- Map <Integer , Integer > idxMap = new HashMap <>();
152- while (!treeSet .isEmpty ()) {
153- int originIdx = treeSet .pollFirst ();
154- idxMap .put (originIdx , idx ++);
155- list .add (originIdx );
156- }
157-
158- // 坐标点数
159- int N = idxMap .size ();
145+ int [] yArr = getDiscrete (buildings );
160146
147+ int N = yArr .length ;
161148 // 线段树
162149 SegmentTree segmentTree = new SegmentTree (N );
163150 for (int [] building : buildings ) {
164- int left = idxMap . get ( building [0 ]);
151+ int left = getId ( yArr , building [0 ]);
165152 // 左闭右开
166- int right = idxMap . get ( building [1 ]) - 1 ;
153+ int right = getId ( yArr , building [1 ]) - 1 ;
167154 segmentTree .update (left , right , building [2 ], 1 , N , 1 );
168155 }
169156
@@ -173,13 +160,33 @@ public List<List<Integer>> getSkyline2(int[][] buildings) {
173160 for (int i = 1 ; i <= N ; i ++) {
174161 int height = segmentTree .getMax (i , i , 1 , N , 1 );
175162 if (height != pre ) {
176- resList .add (List .of (list . get ( i - 1 ) , height ));
163+ resList .add (List .of (yArr [ i - 1 ] , height ));
177164 pre = height ;
178165 }
179166 }
180167 return resList ;
181168 }
182169
170+ private int [] getDiscrete (int [][] buildings ) {
171+ Set <Integer > set = new HashSet <>();
172+ for (int [] x : buildings ) {
173+ set .add (x [0 ]);
174+ set .add (x [1 ]);
175+ }
176+ int sz = set .size ();
177+ int [] yArr = new int [sz ];
178+ int id = 0 ;
179+ for (Integer x : set ) {
180+ yArr [id ++] = x ;
181+ }
182+ Arrays .sort (yArr );
183+ return yArr ;
184+ }
185+
186+ private int getId (int [] yArr , int x ) {
187+ return Arrays .binarySearch (yArr , x ) + 1 ;
188+ }
189+
183190 private static class SegmentTree {
184191 private final int [] max ;
185192 private final int [] lazy ;
0 commit comments