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

非唯一排序数组中的第k个最小元素

洪胤
2023-03-14

这可能是微软的面试问题。

从排序的数组中找出第k个最小的元素(忽略重复项)
[编辑]:数组可能包含重复项(未指定)。

想了很多次,但仍然质疑自己:还有更好的解决方案吗?

取最大堆

时间复杂度:O(NlogK)
空间复杂度:O(K)

这些元素可能是重复的。所以,通过与以前的元素进行比较来检查是否有唯一的元素

还可以使用改进版的快速排序分区算法。但它可能会导致最坏的情况,因为数组已经排序<这里出现了两个问题:
1。如果数组包含重复项,它是否有效
2。这会比我的第二次约会好吗?

我想知道是否存在任何O(logns)解?

共有2个答案

金昌胤
2023-03-14

对第k最小元素似乎有两种不同的解释。我假设它的意思是“第k个最小元素,忽略重复项。”

最佳解决方案是O(n)时间和O(1)空间,正如您在方法2中所描述的。我们可以证明这一点。

  • 我们不能改进O(1)空间(至少在O表示法中不能)

在两个非相邻数组元素具有相同值的特殊情况下,可以推断排序数组的任意长子序列的值:所有中间元素必须共享该值。但这不是一个典型的案例,所以我忽略了它。

桑成荫
2023-03-14

下面是一个O(kLogN)解决方案:

使用二进制搜索的变体来查找给定值的最后一次出现,

  1. 获取第一个值-O(1)。
  2. 搜索最后出现的值O(logN),然后查看下一个元素以获得第二个值-O(1)。
  3. 重复,直到找到第k个值。
 类似资料:
  • 这是一个面试问题。 在具有排序行和列的矩阵中找到Kth最小元素。 Kth最小元素是中的一个,例如,这是否正确?

  • 我的问题是受到这个特殊的SO评论的启发,这个评论没有得到回答(我自己也面临这个问题): 我试图找到排序矩阵中第K个最小的元素: 给定一个nxn矩阵,其中每个行和列都按升序排序,返回矩阵中第k个最小的元素 请注意,它是排序顺序中的第k个最小元素,而不是第k个独立元素 输入:矩阵=[[1,5,9],[10,11,13],[12,13,15],[12,13,15],k=8 输出:13 说明:矩阵中的元素

  • 所以我正在研究一个Leetcode问题,我的代码在某些情况下有效,但在某些情况下失败。 问题是: 给定一个矩阵,其中每个行和列都按升序排序,找出矩阵中第k个最小的元素。 请注意,它是排序顺序中的第k个最小元素,而不是第k个独立元素。 例子: 返回: 13 我的方法是使用minHeap,即使它声明数组已经排序,我仍然需要确保我已经将它从最小值排序到最大值。 这是我的代码: 以下是我的意见: 以下是输

  • 这是一个面试问题。 在排序的行(但不是排序的列)和行之间没有关系的矩阵中查找第k个最小元素。(第一行和第n行之间没有关系——我们只知道每一行都是按升序排列的) 输入示例如下: 这种情况下的结果是 因为20是这个矩阵中第五小的元素。 我首先想到将所有元素添加到minHeap中,然后轮询元素,同时每次迭代从k中减去一个,直到我们得到答案。我还考虑为O(m*n)解决方案实现快速选择,尽管这些解决方案并没

  • 你好,我正在尝试从IEEEXtreme 2014解决这个问题: 给你N个循环排列的整数。有N种方法可以拾取长度为M(M)的连续子序列 我的方法是首先创建一个排序数组列表,将新输入插入正确的位置。我将前M个整数添加到列表中。记录第K个最小值。然后我继续删除最旧的整数并将下一个整数添加到列表中,并将新的第K个值与旧的值进行比较。这是我的排序数组列表。 我认为这种蛮力方法效率不高,但还不能想出任何想法。