isEmpty() 与优先级队列中的 size() == 0 有何不同
How is isEmpty() different from size() == 0 in Priority Queue
所以我正在做 leetcode 问题 "Top K Frequent Element" 并且我使用了 priorityQueue 作为频率。当我开始轮询数字并插入 arraylist 时,for 循环不会以某种方式轮询队列中的所有元素。为什么?
(假设PQ有两个元素)
while(!pq.isEmpty()){
ls.add(pq.poll());
}
for(int b = 0; b < pq.size();b++){
ls.add(pq.poll());
}
这两个循环不应该打印出同样的东西吗?
我从 while 循环中得到了正确答案,而我从 for 循环中只得到了一个元素
与第二种方法的不同之处在于,b < pq.size()
的值在每次迭代时 变化 ,因为当您删除元素时元素数量会减少:pq.poll()
。要获得相同的结果(假设我们在进行迭代时不向队列中添加更多元素),试试这个:
for (int b = 0, n = pq.size(); b < n; b++) {
ls.add(pq.poll());
}
在上面的代码片段中,我们在迭代开始时将 pq
的大小恰好保存 一次 ,以确保它不会改变。这会更好,因为它考虑了并发 insertions/deletions:
的情况
while (pq.size() > 0) {
ls.add(pq.poll());
}
所以我正在做 leetcode 问题 "Top K Frequent Element" 并且我使用了 priorityQueue 作为频率。当我开始轮询数字并插入 arraylist 时,for 循环不会以某种方式轮询队列中的所有元素。为什么?
(假设PQ有两个元素)
while(!pq.isEmpty()){
ls.add(pq.poll());
}
for(int b = 0; b < pq.size();b++){
ls.add(pq.poll());
}
这两个循环不应该打印出同样的东西吗?
我从 while 循环中得到了正确答案,而我从 for 循环中只得到了一个元素
与第二种方法的不同之处在于,b < pq.size()
的值在每次迭代时 变化 ,因为当您删除元素时元素数量会减少:pq.poll()
。要获得相同的结果(假设我们在进行迭代时不向队列中添加更多元素),试试这个:
for (int b = 0, n = pq.size(); b < n; b++) {
ls.add(pq.poll());
}
在上面的代码片段中,我们在迭代开始时将 pq
的大小恰好保存 一次 ,以确保它不会改变。这会更好,因为它考虑了并发 insertions/deletions:
while (pq.size() > 0) {
ls.add(pq.poll());
}