首页 > 其他 > 详细

218. The Skyline Problem

时间:2016-09-15 11:03:26      阅读:246      评论:0      收藏:0      [点我收藏+]
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;
}

 

218. The Skyline Problem

原文:http://www.cnblogs.com/zmyvszk/p/5874449.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!