我知道以前有人问过这个问题,但这个问题是关于我的具体代码。我试图做一个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
我在一个面试问题网站上运行这个,网站继续告诉我我的代码超时了。我不明白为什么。
你的上述方法行不通。因为矩阵是按行和列排序的。考虑下面的矩阵
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必然允许