1、题目描述
https://leetcode-cn.com/problems/kth-smallest-element-in-a-sorted-matrix/
给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素。
请注意,它是排序后的第k小元素,而不是第k个元素。
matrix = [
[ 1, 5, 9],
[10, 11, 13],
[12, 13, 15]
],
k = 8,
返回 13。
说明: 你可以假设 k 的值永远是有效的, 1 ≤ k ≤ n^2 。
2、代码详解
二分查找
class Solution(object):
def kthSmallest(self, matrix, k):
'''
给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。
请注意,它是排序后的第 k 小元素,而不是第 k 个不同的元素
'''
n = len(matrix) # n x n矩阵
left = matrix[0][0]
right = matrix[-1][-1]
def search_less_equal(mid): # 找该值在矩阵是排第几个
i = 0
j = n - 1 # 第0行第n-1列,从右上角开始
res = 0
while i < n and j >= 0:
if matrix[i][j] <= mid:
res += (j + 1) # 至少是排 第j+1个 小的元素
i += 1 # 下一行 找
else:
j -= 1 # 向 同行的左边列 找
return res
while left < right:
mid = (left + right) // 2
num = search_less_equal(mid) # 找该mid在矩阵是排第几个
if num < k:
left = mid + 1 # left变大
else:
right = mid # right变小
return left
matrix = [[1, 5, 9],
[10, 11, 13],
[12, 13, 15]]
k = 8 # 返回13
s = Solution()
print(s.kthSmallest(matrix, k))
排序法
class Solution(object):
def kthSmallest(self, matrix, k):
"""
:type matrix: List[List[int]]
:type k: int
:rtype: int
"""
l = []
for row in matrix:
l += row
return sorted(l)[k-1]
3、其他解法
Heap