本文共 2085 字,大约阅读时间需要 6 分钟。
Given a n x n matrix where each of the rows and columns are sorted in ascending order, find the kth smallest element in the matrix.
Note that it is the kth smallest element in the sorted order, not the kth distinct element.
Example:
matrix = [
[ 1, 5, 9], [10, 11, 13], [12, 13, 15] ], k = 8,return 13.
Note: You may assume k is always valid, 1 ≤ k ≤ n2.来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/kth-smallest-element-in-a-sorted-matrix 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。二维数组每一列都是递增的,找到二维数组中,第k大的数字。
二分法,找到数组中最小的元素matrix[0][0]和最大的元素matrix[length - 1][matrix[0].length - 1],对这两个元素进行二分法。每次都找到,整个二维数组中不大于这个target的数字个数。
class Solution { public int kthSmallest(int[][] matrix, int k) { int left = matrix[0][0]; int right = matrix[matrix.length - 1][matrix[0].length - 1]; while (left < right) { int mid = left + (right - left) / 2; int count = 0; // 找到二维数组中,不大于mid的数字个数 for (int i = 0; i < matrix.length; i++) { count += countSmall(matrix, mid, i); } // 个数小于k,那么答案肯定比left大。 if (count < k) { left = mid + 1; } else { // 个数大于k,那么答案是right或者比right小,所以这里不用mid - 1。 right = mid; } } // 最后肯定是left = right,取任意一个 return left; } public int countSmall(int [][] matrix, int num, int i) {// 用二分法找到matrix[i]这列中,不大于num的数字的个数 if (matrix[i][0] > num) { return 0; } if (matrix[i][matrix[i].length - 1] <= num) { return matrix[i].length; } int left = 1; int right = matrix[i].length - 1; while (left < right) { int mid = left + (right - left) / 2; if (matrix[i][mid] > num && matrix[i][mid - 1] <= num ) { return mid; } if (matrix[i][mid] > num) { right = mid; continue; } if (matrix[i][mid] <= num) { left = mid + 1; continue; } } return left; }}