题目描述
给定一个
n x n
矩阵,其中每行和每列元素均按升序排序,找到矩阵中第
k
小的元素。
请注意,它是排序后的第
k
小元素,而不是第
k
个不同的元素。
解题思路
上一篇博客直接使用了python 的内置包heapq来实现,这篇博客使用python来实现小根堆代码,代码不能直接贴上去运行,有些变量命名名字不同
def Heap_adjust(data, start, end):
i = start; j = 2 * i + 1
while j < end:
if j + 1 < end and data[j][0] > data[j + 1][0]:
j += 1
if data[i][0] > data[j][0]:
data[i], data[j] = data[j], data[i]
i = j
j = 2 * i + 1
else:
break
#测试Heap_adjust函数能否正确运行
# a = [10, 1, 2, 5, 4, -1, 0]
# m = len(a)
# count = m // 2
# for i in range(count):
# Heap_adjust(a, count - i - 1, m)
# print(a)
def Build_heap(data):
m = len(data)
count = m // 2
for i in range(count):
Heap_adjust(data, count - i - 1, m)
return data
matrix = [[ 1, 5, 9],
[10, 11, 13],
[12, 13, 15]]
target = 6
m = len(matrix); n = len(matrix[0])
data = [(matrix[i][0], i, 0) for i in range(m)]
min_heap = Build_heap(data)
for i in range(target - 1):
num, x, y = min_heap.pop(0)
min_heap = Build_heap(min_heap)
if y != n - 1:
min_heap.append((matrix[x][y + 1], x, y + 1))
min_heap = Build_heap(min_heap)
print(min_heap.pop(0)[0])