首页 > 代码库 > 218. The Skyline Problem
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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。