首页 > 解决方案 > isEmpty() 与优先级队列中的 size() == 0 有何不同

问题描述

所以我在做 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 循环中只得到了一个元素

标签: javapriority-queue

解决方案


与第二种方法的不同之处在于, 的值在每次迭代中b < pq.size()都会发生变化,因为当您删除一个元素时元素的数量会减少:pq.poll()。要获得相同的结果(假设我们在进行迭代时不向队列中添加更多元素),请尝试以下操作:

for (int b = 0, n = pq.size(); b < n; b++) {
    ls.add(pq.poll());
}

在上面的代码片段中,我们在迭代开始时只保存一次的大小pq确保它不会改变。这会更好,因为它考虑了并发插入/删除的情况:

while (pq.size() > 0) {
    ls.add(pq.poll());
}

推荐阅读