leetcode.矩阵.378有序矩阵中第K小的元素-Java

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     }

猜你喜欢

转载自www.cnblogs.com/XRH2019/p/11930062.html