1. 题目
给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素。
请注意,它是排序后的第k小元素,而不是第k个元素。
示例:
matrix = [
[ 1, 5, 9],
[10, 11, 13],
[12, 13, 15]
],
k = 8,
返回 13。
说明:
你可以假设 k 的值永远是有效的, 1 ≤ k ≤ n2 。
2. 思路
以左上角为最小值,右下角为最大值进行二分查找,找到mid = left + (right - left ) // 2 , 循环遍历数组记录比mid小的个数, 判断与k的关系,若小于,则left = mid + 1 , 若大于,则right = mid - 1。 最后left+1=right 即为第k小的数。
class Solution:
def kthSmallest(self, matrix: List[List[int]], k: int) -> int:
row = len(matrix)
col = len(matrix[0])
left = matrix[0][0]
right = matrix[row-1][col-1]
while left <= right:
mid = left + (right - left) // 2
count = 0
for line in matrix:
for i in line:
if i <= mid:
count += 1
if count < k:
left = mid + 1
else:
right = mid - 1
return left