これは前に尋ねられたことは分かっていますが、この質問は私の特定のコードに関するものです。私はソートされた行列のサブ間隔の中点にkを比較するpsuedo QuickSelectアルゴリズムを実行しようとしています。QuickSelectを使用したk番目の最小要素のソート済みの行列
タイムアウトエラーが発生しています。
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)
私は間隔のエンドポイントの(row, col)
を含んmatrixRecur
にタプルを渡す:
matrix = [
[ 1, 5, 9],
[10, 11, 13],
[12, 13, 15]
],
k = 8
はここに私のコードです:ここでは
は行列です。行列全体を検索したい場合は、(0, 0)
とを渡します。
matrixRecur
は、サブインターバルを調べ、エンドポイントの行のcol番号に基づいて中間点を決定し、中間点よりも少ない要素の数を数え、それを
k
と比較します。
k
が中点(
lcount
)未満の要素の数よりも少ない場合は、中間点よりも多くて
lcount
の要素があり、
k
<
lcount
であるため、k番目の最小要素は左の間隔内にあります。
私はこれをインタビューの質問サイトで実行しており、サイトでは引き続き自分のコードがタイムアウトしていると伝えています。なぜ私は見ていない。
私は、その解決策を見ました。バイナリ検索で解決できるかどうかは疑問だった。私はそれが分かっています。助けてくれてありがとう。また、私は上記の行列のためにタイムアウトする理由は、私の中間値が正しく計算されていないためだと思います。 –