1.题目基本信息
1.1.题目描述
给你一个 n x n 矩阵 matrix ,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。
请注意,它是 排序后 的第 k 小元素,而不是第 k 个 不同 的元素。
你必须找到一个内存复杂度优于 O(n^2) 的解决方案。
1.2.题目地址
https://leetcode.cn/problems/kth-smallest-element-in-a-sorted-matrix/description
2.解题方法
2.1.解题思路
归并排序+小根堆
2.2.解题步骤
第一步,初始化小根堆,其中堆中每个元素为(矩阵元素值,行索引,列索引)。初始化将矩阵所有行的第一个元素的item压入堆中。
第二步,循环k次,每次循环弹出堆中的最小item,并将该item的右边的一个元素添加到小跟堆中(确保该item没有超过矩阵范围)。第k次循环弹出的元素值即为题解。
3.解题代码
Python代码
import heapq
class Solution:
# 归并排序+小根堆
def kthSmallest(self, matrix: List[List[int]], k: int) -> int:
length=len(matrix)
# 第一步,初始化小根堆,其中堆中每个元素为(矩阵元素值,行索引,列索引)。初始化将矩阵所有行的第一个元素的item压入堆中。
heap=[]
for i in range(length):
heapq.heappush(heap,(matrix[i][0],i,0))
# 第二步,循环k次,每次循环弹出堆中的最小item,并将该item的右边的一个元素添加到小跟堆中(确保该item没有超过矩阵范围)。第k次循环弹出的元素值即为题解。
result=0
for j in range(k):
item=heapq.heappop(heap)
result=item[0]
nextCol=item[2]+1
if nextCol<length:
heapq.heappush(heap,(matrix[item[1]][nextCol],item[1],nextCol))
# print(result)
return result