当前位置: 首页 > 知识库问答 >
问题:

PriorityQueue算法搜索最小k值返回错误结果

傅越
2023-03-14

我试图找到数组的最小第k个值。我使用priorityQueue数据结构来删除大于k的值,但返回的结果不正确。我的代码如下:

public class Main2 {
    PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>();
    
    public int smallestK(int[] arr, int k) {
        
        for(int num : arr) {
            maxHeap.add(num);
            if(maxHeap.size() > k) {
                maxHeap.poll();
            }
        }
        return maxHeap.peek(); 
    }
    
    public static void main(String[] args) {
        int arr[] = { 12, 3, 5, 7, 4, 19, 26 };
        
        Main2 smallest = new Main2();
        int result = smallest.smallestK(arr, 3); //should return 5, but returns 12
        System.out.println(result);
    }
}

如何修复算法以返回正确的结果?

共有1个答案

章威
2023-03-14

您没有创建最大堆,而是创建最小堆。要创建最大堆,需要将比较器传递给PriorityQueue构造函数:

PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>(Collections.reverseOrder());
 类似资料:
  • 我正在用Hibernate Search 4.5.1和Spring 4.0.5版本构建一个应用程序。我正在尝试索引以下类: 我正在构建一个junit测试用例,看起来如下所示: 我还注意到在luke lucene上,一些索引词的长度最多为6个字符,例如,一首歌的艺术家是“后代”,而索引中存储的词是“the”和“offspr”。第一个可以,但第二个不应该是“后代”。为什么要截断名字?

  • 我用java编写了一个实用的二叉搜索树,除了一个关键的函数,搜索。我使用的逻辑是,我将检查根是否为空,然后我要搜索的术语是否等于根(所以返回根)或>根(所以搜索右子树)或 使用printlns查看正在发生的事情,我发现如果值在那里,它将通过正确的if语句(包括将BNode n设置为找到的值),但随后由于某种原因将再次通过方法(返回null)。 这个方法唯一起作用的时候是在搜索根节点的时候,这对我来

  • 我正在编写一个在简单的对等网络中搜索客户端的方法。我编写的方法 searchForResponsibleClient 在此网络中获取一个点,并检查调用 searchForResponsibleClient 方法的客户端是否负责此点。 如果它有责任,它会自己回来。 如果它不负责,它会查看其客户端邻居(保存在对象中),并检查是否有任何邻居负责,如果是这样,它将返回邻居。 这两个场景工作正常。 如果邻居

  • 本文向大家介绍在Javascript二进制搜索树中搜索最小值和最大值,包括了在Javascript二进制搜索树中搜索最小值和最大值的使用技巧和注意事项,需要的朋友参考一下 在二元搜索树中,如果我们查看左孩子总是比父孩子小的属性,我们会发现,如果继续向左孩子迭代直到到达没有左孩子的节点,我们基本上会发现BST中最小的元素。 让我们在代码中实现此功能。从现在开始,我们将仅实现该函数的单个版本,即迭代或

  • 问题内容: 考虑以下Python代码: 运行此命令时,将引发异常: 但是,将其放入浏览器后,搜索将按预期返回。这里发生了什么?如何克服这个问题,以便可以通过编程方式搜索Google? 有什么想法吗? 问题答案: 如果您想通过编程界面“适当”进行Google搜索,请查看Google API 。这些不仅是搜索Google的正式方法,而且如果Google更改结果页面的布局,它们也不太可能改变。

  • 我有三个索引,它们都共享一个特定的键值对。当我用api进行全面搜索时”http://localhost:9200/_search“使用请求正文 它只返回其中两个索引的结果。我尝试使用相同的请求正文,将url更改为仅在丢失的索引中搜索”http://localhost:9200/index_name/_search“这很管用。我有什么遗漏吗? 插入所有三个索引的代码遵循相同的过程,我使用elasti