1.有序矩阵中第K小的元素
给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。请注意,它是排序后的第 k 小元素,而不是第 k 个不同的元素。
思路:二分查找
class Solution { public: bool check(vector<vector<int>>& matrix, int mid, int k, int n) { int i = n - 1; int j = 0;//取左下角 int num = 0; while (i >= 0 && j < n) { if (matrix[i][j] <= mid) { num += i + 1;//记小于等于num的数 j++;//右移一位,变大 } else { i--;//上移一位,变小 } } return num >= k; } int kthSmallest(vector<vector<int>>& matrix, int k) { int n = matrix.size(); int left = matrix[0][0]; int right = matrix[n - 1][n - 1]; while (left < right) { int mid = left + ((right - left) >> 1);//二分 if (check(matrix, mid, k, n)) { right = mid;//如果大于k,说明mid在k右面 } else { left = mid + 1;//如果小于k,说明mid在k左面 } } return left; } };