我知道這已被問過,但這個問題是關於我的具體代碼。我正在嘗試做一個psuedo QuickSelect算法,其中我將k與排序矩陣的子區間的中點進行比較。使用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
其含有間隔的端點的(row, col)
。所以,如果我想搜索整個矩陣,我通過(0, 0)
和。 matrixRecur
將查看子區間,根據端點的行列數確定中點,對小於中點的元素數進行計數,並將其與k
進行比較。如果k
小於中點(lcount
)以下的元素的數量,則第k個最小元素在左側區間內,因爲最多有lcount
個元素小於中點,並且。
我在面試問題網站上運行此網站,該網站繼續告訴我我的代碼超時。我不明白爲什麼。
我看到的解決方案。我只是想知道是否可以用二進制搜索來解決。我知道它是。謝謝您的幫助。另外我認爲我爲上述矩陣獲取時間的原因是因爲我的midvalue計算不正確。 –