[378][中等][堆][二分] 有序矩阵中第K小的元素
最后更新于
最后更新于
class Solution:
def kthSmallest(self, matrix: List[List[int]], k: int) -> int:
n = len(matrix)
heap = [(matrix[i][0], i, 0) for i in range(n)]
heapq.heapify(heap)
for i in range(k - 1):
num, r, c = heapq.heappop(heap)
if c < n - 1:
heapq.heappush(heap, (matrix[r][c + 1], r, c + 1))
return heap[0][0]class Solution:
def kthSmallest(self, matrix: List[List[int]], k: int) -> int:
n = len(matrix)
left, right = matrix[0][0], matrix[n - 1][n - 1] # 既然用二分法, 用`left`和`right`命名最合适
while left < right:
mid = (left + right) // 2
if self.is_left(matrix, mid, k, n):
right = mid
else:
"""
这里count加1是因为: 这里判断是在右半边, 而mid等于left时是被判别为左边的, 因此mid肯定不是最终的结果
"""
left = mid + 1
return left
@staticmethod
def is_left(mat, mid, k, n):
i, j = n - 1, 0
count = 0
while i >= 0 and j < n:
if mat[i][j] > mid:
i -= 1
else:
count += i + 1
j += 1
return count >= k