gpt4 book ai didi

java - 我在使用 Java 8 PriorityQueue 比较器时做错了什么?

转载 作者:搜寻专家 更新时间:2023-10-31 20:08:11 24 4
gpt4 key购买 nike

我正在尝试解决此问题 exercise这是我的解决方案。它基本上包含一个 TreeMap ,用于将相同垂直偏移量的节点映射到一个键。并在同一(水平级别)有多个键使用节点处的值时使用优先级队列来拆分关系。

public List<List<Integer>> verticalTraversal(TreeNode root) {
Map<Integer, PriorityQueue<Node>> map = new TreeMap<>();
List<List<Integer>> out = new ArrayList<>();
if(root == null)
return out;
Queue<Node> q = new LinkedList<>();
Node r = new Node(root, 0, 0);
q.add(r);
while(!q.isEmpty()) {
Node curr = q.remove();
int x = curr.x;
int y = curr.y;
PriorityQueue<Node> pq = map.getOrDefault(y, new PriorityQueue<Node>((a,b) ->(a.x == b.x? a.t.val - b.t.val: a.x - b.x)));
pq.add(curr);
map.put(y,pq);
if(curr.t.left!=null){
Node left = new Node(curr.t.left, x+1, y-1);
q.add(left);
}
if(curr.t.right!=null){
Node right = new Node(curr.t.right, x+1, y + 1);
q.add(right);
}
}
for (Map.Entry<Integer, PriorityQueue<Node>> entry : map.entrySet()){
PriorityQueue<Node> pq = entry.getValue();
List<Integer> vals = new ArrayList<>();
for (Node pqNode: pq){
vals.add(pqNode.t.val);

}
out.add(new ArrayList<Integer>(vals));

}
return out;
}




class Node {
TreeNode t;
int y;
int x;
Node(TreeNode t, int x, int y) {
this.t = t;
this.x = x;
this.y = y;
}
}

我认为这是问题所在

  PriorityQueue<Node> pq = map.getOrDefault(y, new PriorityQueue<Node>((a,b) ->(a.x == b.x? a.t.val - b.t.val: a.x - b.x)));

a.x 不等于 b.x 时,我得到了预期的顺序,但当它们相等时,它似乎不符合 val

这是失败的测试用例 enter image description here实际值:[[7,9],[5,6],[0,2,4],[1,3],[8]]预期:[[9,7],[5,6],[0,2,4],[1,3],[8]]

最佳答案

你做错的是你迭代了优先级队列的元素而不是轮询它。

PriorityQueue#iterator() 的文档明确指出:

Returns an iterator over the elements in this queue. The iterator does not return the elements in any particular order.

代替写作

for (Node pqNode: pq){
vals.add(pqNode.t.val);
}

你应该使用:

Node pqNode;
while ((pqNode = pq.poll()) != null) {
vals.add(pqNode.t.val);
}

关于java - 我在使用 Java 8 PriorityQueue 比较器时做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54563747/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com