这是我的代码:
public static List<int[]> getSkyline(int[][] buildings) {
List<int[]> res = new ArrayList<>();
PriorityQueue<int[]> heights = new PriorityQueue<>(buildings.length * 2, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
if (o1[0] == o2[0]) {
return o1[1] - o2[1];
} else {
return o1[0] - o2[0];
}
}
});
for (int[] h : buildings) {
heights.add(new int[]{h[0], -h[2]});
heights.add(new int[]{h[1], h[2]});
}
for (int[] height : heights) {
System.out.println(Arrays.toString(height));
}
return res;
}
public static void main(String[] args) {
getSkyline(new int[][]{{0, 2, 3}, {2, 5, 3}});
}
在我的想法中,由于输入为new int[][]{{0, 2, 3}, {2, 5, 3}}
,因此输出应为[0, -3][2, -3][2, 3][5, 3]
,但实际上显示为[0, -3][2, 3][2, -3][5, 3]
。谁能告诉我我的代码有什么问题?提前谢谢。
答案 0 :(得分:1)
原因是PriorityQueue<T>
在迭代时没有对元素进行排序:
public Iterator<E> iterator()
的文档说明了方法
返回此队列中元素的迭代器。迭代器不会以任何特定顺序返回元素。
要获得您期望的排序,您需要逐个从优先级队列中删除元素,然后打印它们:
while (heights.size() != 0) {
int[] height = heights.poll();
System.out.println(Arrays.toString(height));
}
此更改产生以下输出:
[0, -3]
[2, -3]
[2, 3]
[5, 3]