378.有序矩陣中第k小的元素
題目描述
給定一個 矩陣,其中每行和每列元素均按升序排序,找到矩陣中第 小的元素。
請注意,它是排序後的第 小元素,而不是第個不同的元素
示例
matrix = [
[ 1, 5, 9],
[10, 11, 13],
[12, 13, 15]
],
k = 8,
返回 13
提示 你可以假設 的值永遠是有效的,
解題思路——歸併排序
矩陣中,每行list都是有序的,等價於個list歸併排序。因此根據歸併排序思想,先獲取矩陣第一列進行堆排序,提取出堆中最小的數和該數的行、列數,將該行的下一列數入堆排序,然後繼續提取最小數,依次獲取到個最小值即爲目標結果。
代碼實現
class Solution:
def kthSmallest(self, matrix: List[List[int]], k: int) -> int:
n = len(matrix)
pq = [(matrix[i][0],i,0) for i in range(n)]
heapq.heapify(pq)
for i in range(k-1):
num,x,y = heapq.heappop(pq)
if y != n-1:
heapq.heappush(pq,matrix[x][y+1], x ,y+1)
return heapq.heappop(pq)[0]
複雜度分析
時間複雜度爲,歸併k次,每次都進行插入和彈出,其時間消耗爲
空間複雜度爲,堆排序消耗空間始終都爲
注意 在最壞情況下有可能爲