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

使用QuickSelect的K个最小元素排序矩阵

糜昌胤
2023-03-14

我知道以前有人问过这个问题,但这个问题是关于我的具体代码。我试图做一个psuedo-QuickSelect算法,将k与排序矩阵子区间的中点进行比较。

我一直收到一个超时错误。

以下是矩阵:

matrix = [
   [ 1,  5,  9],
   [10, 11, 13],
   [12, 13, 15]
],
k = 8

下面是我的代码:

def kthSmallest(self, matrix, k):
    """
    :type matrix: List[List[int]]
    :type k: int
    :rtype: int
    """

    return self.matrixRecur(matrix, (0, 0), (len(matrix) - 1, len(matrix[0]) - 1), k)

def matrixRecur(self, splicedMatrix, left, right, k):
    start_row, start_col = left
    end_row, end_col = right
    mid_row = (start_row + end_row)/2
    mid_col = (start_col + end_col)/2

    i = start_row
    j = start_col
    lcount = 0
    while(not (i == mid_row and j == mid_col)):
        if j < len(splicedMatrix[0]):
            j += 1
        else:
            j = 0
            i += 1
        lcount += 1
    if k == lcount:
       return splicedMatrix[mid_row][mid_col]
    elif k < lcount:
        return self.matrixRecur(splicedMatrix, (start_row, start_col), (mid_row, mid_col), k)
    else:
        return self.matrixRecur(splicedMatrix, (mid_row, mid_col + 1), (end_row, end_col), k-lcount)

我将元组传递给matrixRecur,其中包含区间的endpoint的(row, coll)。因此,如果我想搜索整个矩阵,我会传递(0,0)(n, n)matrixRecur将查看子区间,根据endpoint的行号确定中点,计算小于中点的元素数量,将其与k进行比较。如果k小于小于中点的元素数(lCount),那么第k个最小的元素在左间隔内,因为最多有lCount小于中点的元素k

我在一个面试问题网站上运行这个,网站继续告诉我我的代码超时了。我不明白为什么。

共有1个答案

龚德本
2023-03-14

你的上述方法行不通。因为矩阵是按行和列排序的。考虑下面的矩阵

10, 20, 30, 40
15, 25, 35, 45
24, 29, 37, 48
32, 33, 39, 50

在这种情况下,你的方法将失败。因为要遍历整个2D矩阵,所以需要暂停。最坏情况下的时间复杂度是O(mn)(m和n分别是行数和列数)。

您可以使用最小堆来解决这个问题。

算法:

1. Build a min heap of first row elements. A heap entry also stores row number and column number.

2. for(int i=0;i<k;i++)
       Get minimum element (or root) from min heap.
       Find row number and column number of the minimum element.
       Replace root with the next element from same column and min-heapify the root.

3. Return the last extracted root.

时间复杂度:O(n kLogn)

来源:二维矩阵中的第k个最小值

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

  • 这是一个面试问题。 在具有排序行和列的矩阵中找到Kth最小元素。 Kth最小元素是中的一个,例如,这是否正确?

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

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

  • 我正在尝试使用quickselect算法找到数组中的第k个最小值。但是,当我尝试随机选择枢轴时,输出也是随机的。 下面是我的方法实现, 这里,是数组的大小,是要找到的第k个最小元素。 当我使用时,该代码可以正常工作。 我的猜测是情况出了问题 但我搞不清哪里出了问题,怎么修复。我花了几个小时调试它,修改代码,但还是能解决问题。 下面是我正在尝试的测试用例, 并且, 在这些测试用例中,random p

  • 如果您有长度的排序数组,请查找其中最小的元素。这里有一些潜在的解决方案,有些涉及最小堆或二进制搜索,但我想知道使用QuickSelect的时间复杂度是多少。如果我们简单地将每个数组连接在一起,并在组合数组上使用quickselect。 Quickselect在一般情况下以线性时间运行,但是数组的组合确实会扩展搜索空间,但它比使用合并策略更有效,因为如果选择了好的枢轴,Quickselect必然允许