码迷,mamicode.com
首页 > 其他好文 > 详细

218. The Skyline Problem

时间:2016-09-15 11:03:56      阅读:123      评论: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
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!