- The Skyline Problem

public List<int[]> getSkyline(int[][] buildings) {
List<int[]> result = new ArrayList<>();
List<int[]> height = new ArrayList<>();
for(int[] b:buildings) {
height.add(new int[]{b[0], -b[2]});
height.add(new int[]{b[1], b[2]});
}
Collections.sort(height, (a, b) -> {
if(a[0] != b[0])
return a[0] - b[0];
return a[1] - b[1];
});
Queue<Integer> pq = new PriorityQueue<>((a, b) -> (b - a));
pq.offer(0);
int prev = 0;
for(int[] h:height) {
if(h[1] < 0) {
pq.offer(-h[1]);
} else {
pq.remove(h[1]);
}
int cur = pq.peek();
if(prev != cur) {
result.add(new int[]{h[0], cur});
prev = cur;
}
}
return result;
}
- 优先队列:最小堆
- 最大堆的定义
Queue<Integer> pq = new PriorityQueue<>((a, b) -> (b - a));
或者
Queue<Integer> maxQ = new PriorityQueue<>(new Comparator<Integer>(){
public int compare(Integer a, Integer b){
return -a.compareTo(b);
}
});
2.Perfect Rectangle

public boolean isRectangleCover(int[][] rectangles) {
// 面积“守恒”
//只有四个点出现一次,出现一次的一定是四个角。其他点的个数为2或4
HashSet<String> set = new HashSet<>();
int areasum = 0;
int xmin = Integer.MAX_VALUE, xmax = Integer.MIN_VALUE;
int ymin = Integer.MAX_VALUE, ymax = Integer.MIN_VALUE;
for(int[] rec : rectangles){
xmin = Math.min(xmin, Math.min(rec[0], rec[2]));
xmax = Math.max(xmax, Math.max(rec[0], rec[2]));
ymin = Math.min(ymin, Math.min(rec[1], rec[3]));
ymax = Math.max(ymax, Math.max(rec[3], rec[3]));
areasum += (rec[2]- rec[0]) * (rec[3] - rec[1]);
if(!set.add(rec[0] + " " + rec[1])) set.remove(rec[0] + " " + rec[1]);
if(!set.add(rec[0] + " " + rec[3])) set.remove(rec[0] + " " + rec[3]);
if(!set.add(rec[2] + " " + rec[1])) set.remove(rec[2] + " " + rec[1]);
if(!set.add(rec[2] + " " + rec[3])) set.remove(rec[2] + " " + rec[3]);
}
if(set.size() != 4 || !set.contains(xmin + " " + ymin) ||
!set.contains(xmin + " " + ymax) || !set.contains(xmax + " " + ymin)|| !set.contains(xmax + " " + ymax))
return false;
return areasum == (ymax - ymin) * (xmax - xmin);
}
本文深入探讨了天际线问题的高效算法实现,通过使用优先队列来跟踪建筑物高度变化,实现城市天际线轮廓的精确描绘。同时,分析了如何判断一组矩形是否完全覆盖一个矩形区域,利用集合与面积守恒原理验证完美矩形覆盖的有效性。
1090

被折叠的 条评论
为什么被折叠?



