- 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);
}