题目描述:
给定一个
n x n
矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k
小的元素。
请注意,它是排序后的第k
小元素,而不是第k
个不同的元素。
示例:
matrix = [ [ 1, 5, 9], [10, 11, 13], [12, 13, 15] ], k = 8, 返回 13。
分析:
题目有两点,每列是排好序的,每行是排好序的。
所以我希望,现在每列找到最小的元素,然后根据这个最小的元素进行每行的查找。
然后把这行元素更新到列中。
说的不是很明白,看图吧
想到用一个大小为 n 的小顶堆来维护,记录每个数的大小和位置,每次堆顶元素出来,然后加入该元素所在行的下一个
代码:
class Solution:
def kthSmallest(self, matrix: List[List[int]], k: int) -> int:
n = len(matrix)
res = []
for i in range(n):
heapq.heappush(res, (matrix[i][0], i, 0))
for j in range(k-1):
cur,x,y = heapq.heappop(res)
if y < n -1:
heapq.heappush(res, (matrix[x][y+1], x, y+1))
return res[0][0]
return list(heapq.merge(*matrix))[k-1]
复杂度分析:
时间复杂度:O(klogn),每次 出堆和进堆,时间复杂度都为logn(和堆的大小有关)
空间复杂度:O(n) ,堆的大小不变