1. 具体题目
给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素。请注意,它是排序后的第k小元素,而不是第k个元素。
示例:
matrix = [
[ 1, 5, 9],
[10, 11, 13],
[12, 13, 15]
],
k = 8, 返回 13。
2. 思路分析
二分法:初始化 low 指针为矩阵中最小元素:matrix[0][0],high 指针为矩阵中最大元素:matrix[rows-1][cols-1],之后进行二分查找,迭代时每次计算矩阵中有多少元素的值小于等于 mid 值,根据比较结果更新 low & high 指针。将二分搜索的结束条件设置为 low == high,可以证明最后的结果值一定在矩阵中。
3. 代码
1 public int kthSmallest(int[][] matrix, int k) { 2 int rows = matrix.length; 3 int cols = matrix[0].length; 4 int low = matrix[0][0]; 5 int high = matrix[rows-1][cols-1]; 6 while(low < high){ 7 int mid = low + (high - low) / 2; 8 int count = 0; 9 for(int i = 0; i < rows; i++){ 10 for(int j = 0; j < cols; j++){ 11 if(matrix[i][j] <= mid) 12 count++; 13 } 14 } 15 if(count < k){ 16 low = mid + 1; 17 }else{ 18 high = mid; 19 } 20 } 21 return low; 22 }
原文地址:https://www.cnblogs.com/XRH2019/p/11930062.html
时间: 2024-10-08 10:46:30