218. The Skyline Problem

Posted 我的名字叫周周

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}

 

以上是关于218. The Skyline Problem的主要内容,如果未能解决你的问题,请参考以下文章

218. The Skyline Problem

218. The Skyline Problem-Hard

LeetCode Top Interview Questions 218. The Skyline Problem (Java版; Hard)

题目地址(218. 天际线问题)

题目地址(218. 天际线问题)

131. The Skyline Problem