原題
在一個排序矩陣中找從小到大的第 k 個整數。
排序矩陣的定義為:每一行遞增,每一列也遞增。
樣例
給出 k = 4和一個排序矩陣:
[
[1 ,5 ,7],
[3 ,7 ,8],
[4 ,8 ,9],
]
返回 5。
解題思路
- 首先把左上角的元素放入minHeap中,進入while循環,每次pop一個最小值,然后把該位置右邊和下班的值+坐標放入minHeap中。k減一,當k等于0時,返回當前的值
- 同時要注意,另外開一個二維數組記錄哪些元素已經被訪問過,因為同一個元素可能在A的下面和B的右面
完整代碼
import Queue
class Solution(object):
def kthSmallest(self, matrix, k):
"""
:type matrix: List[List[int]]
:type k: int
:rtype: int
"""
exist = [[False for i in range(len(matrix[0]))] for j in range(len(matrix))]
q = Queue.PriorityQueue()
q.put((matrix[0][0], 0, 0))
exist[0][0] = True
while k > 0:
cur, x, y = q.get()
if x + 1 < len(matrix) and not exist[x+1][y]:
q.put((matrix[x+1][y], x+1, y))
exist[x+1][y] = True
if y + 1 < len(matrix[0]) and not exist[x][y+1]:
q.put((matrix[x][y+1], x, y+1))
exist[x][y+1] = True
k -= 1
return cur