题目
给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。
请注意,它是排序后的第 k 小元素,而不是第 k 个不同的元素。示例:
matrix = [
[ 1, 5, 9],
[10, 11, 13],
[12, 13, 15]
],
k = 8,返回 13。
提示:
你可以假设 k 的值永远是有效的,1 ≤ k ≤ n2 。
二分查找
由题目给出的性质可知, 矩阵内的元素左上角最小, 右下角最大. 假设left
和right
分别为二分法使用时的最大最小值. 使用二分法的步骤是
计算出矩阵内最大值和最小值的均值(即
mid=(left+right)/2
)然后从矩阵的左下角(
matrix[n-1][0]
)到右上角(matrix[0][n-1]
)进行遍历, 找出小于等于mid
的元素的个数.如图所示, 如果当前元素
matrix[i][j]
小于等于mid
, 则小于等于mid
的元素共有i+1
个(考虑到数组下标从0开始), 并且向右移动. 否则向上移动. 直至最后走出矩阵.计算出来小于等于
mid
的元素数目大于k, 说明二分算法需要在右边继续. 否则二分算法在左边继续.
代码如下所示
1 | class Solution { |