力扣—378有序矩阵第k小的数(无heapq,纯python小根堆实现)

题目描述

给定一个 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])

你可能感兴趣的:(力扣—378有序矩阵第k小的数(无heapq,纯python小根堆实现))