java - 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 循环中只得到了一个元素
解决方案
与第二种方法的不同之处在于, 的值在每次迭代中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());
}
推荐阅读
- encryption - AES - 解密/加密速度和每秒加密密钥之间的联系
- vb.net - Docusign 从模板下载文件,该文件使用 Chilkat 和 rest api 获取文件 base64string 格式的非法字符
- rabbitmq - 想要使用 vert.x 为 rabbit MQ 创建一个断路器
- python - 上传文件到 YouTube 时出现 404 错误
- javascript - 从数据列表中的选定选项获取自定义属性
- c# - C#如何创建自己的数据结构方法
- vba - openrecordset 参数太少
- ios - SwiftUI 在关闭工作表时,其后面的视图在几秒钟内无响应
- xcode - Xcode 12.“AVCapturePhotoOutput”类型的值没有成员“supportedFlashModes”
- javascript - jQueryResult.load() 函数导致 CWE-201 veracode 错误