zoukankan      html  css  js  c++  java
  • 218. The Skyline Problem

    class Edge {
    	int x;
    	int height;
    	boolean isStart;
     
    	public Edge(int x, int height, boolean isStart) {
    		this.x = x;
    		this.height = height;
    		this.isStart = isStart;
    	}
    }
    
    public List<int[]> getSkyline(int[][] buildings) {
    	List<int[]> result = new ArrayList<int[]>();
     
    	if (buildings == null || buildings.length == 0
    			|| buildings[0].length == 0) {
    		return result;
    	}
     
    	List<Edge> edges = new ArrayList<Edge>();
     
    	// add all left/right edges
    	for (int[] building : buildings) {
    		Edge startEdge = new Edge(building[0], building[2], true);
    		edges.add(startEdge);
    		Edge endEdge = new Edge(building[1], building[2], false);
    		edges.add(endEdge);
    	}
     
    	// sort edges 
    	Collections.sort(edges, new Comparator<Edge>() {
    		public int compare(Edge a, Edge b) {
    			if (a.x != b.x)
    				return Integer.compare(a.x, b.x);
     
    			if (a.isStart && b.isStart) {
    				return Integer.compare(b.height, a.height);
    			}
     
    			if (!a.isStart && !b.isStart) {
    				return Integer.compare(a.height, b.height);
    			}
     
    			return a.isStart ? -1 : 1;
    		}
    	});
     
    	// process edges
    	PriorityQueue<Integer> heightHeap = new PriorityQueue<Integer>(10, Collections.reverseOrder());
     
    	for (Edge edge : edges) {
    		if (edge.isStart) {
    			if (heightHeap.isEmpty() || edge.height > heightHeap.peek()) {
    				result.add(new int[] { edge.x, edge.height });
    			}
    			heightHeap.add(edge.height);
    		} else {
    			heightHeap.remove(edge.height);
     
    			if(heightHeap.isEmpty()){
    				result.add(new int[] {edge.x, 0});
    			}else if(edge.height > heightHeap.peek()){
    				result.add(new int[]{edge.x, heightHeap.peek()});
    			}
    		}
    	}
     
    	return result;
    }
    
  • 相关阅读:
    Centos7新特性——systemd取代init管理服务
    Git初探
    Nginx内置变量
    Nginx初探
    PHP多进程初步
    golang消息队列nsq
    golang 的 go异步编程通道要注意的问题
    golang 连接池mysql
    golang centos运行方法
    golang go path和go mod的区别
  • 原文地址:https://www.cnblogs.com/zmyvszk/p/5874449.html
Copyright © 2011-2022 走看看