class Solution {
//make a pair class to store x coordinate and height, write a compareTo function
// to compare based increasing order of x coordinate , if x are same , compare
//based on increasing height
public class pair implements Comparable<pair>{
int x ;
int ht ;
pair(int x , int ht){
this.x = x ;
this.ht = ht;
}
//compare to function
public int compareTo(pair o){
if(this.x != o.x)
return this.x - o.x; //increasing order
else
return this.ht - o.ht; //increasing order
}
}
public List<List<Integer>> getSkyline(int[][] buildings) {
// input building x and height
List<pair> input = new ArrayList<>();
for(int i =0 ; i< buildings.length ; i++){
int sp = buildings[i][0]; //starting point
int ep = buildings[i][1]; //ending point
int ht = buildings[i][2]; //height
//adding (sp,ht) and (ep,ht) seperately and adding -ht in sp to distinguish
//that it is a starting point and to handle edge cases (see register)
pair s = new pair(sp,-ht);
pair e = new pair(ep,ht);
input.add(s);
input.add(e);
}
//sort the list in ascending order
Collections.sort(input);
//make a max priority queue
PriorityQueue<Integer> maxheap = new PriorityQueue<>(Collections.reverseOrder());
List<List<Integer>> ans = new ArrayList<>();
int curr = 0; //a pointer for storing current height;
maxheap.add(0);
//iterate the list
for(int i =0 ; i < input.size() ;i++){
int x = input.get(i).x;
int ht = input.get(i).ht;
//if starting point
if(ht < 0)
maxheap.add(-ht); //adding -(-ht) in pq to make it positive
else
maxheap.remove(ht); //o(n) function in PQ
//if curr height and active building's max height are same ,continue
if(curr != maxheap.peek()){
List<Integer> temp = new ArrayList<>();
temp.add(x);
temp.add(maxheap.peek());
ans.add(temp);
//updating current height to active building's height
curr = maxheap.peek();
}
}
return ans;
}
}
Preview:
downloadDownload PNG
downloadDownload JPEG
downloadDownload SVG
Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!
Click to optimize width for Twitter