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

    技术2022-07-12  73

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

    给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。 请注意,它是排序后的第 k 小元素,而不是第 k 个不同的元素。

    思路

    考虑到是在有序矩阵中寻找第K小元素,肯定会用到矩阵的特性,由于矩阵左上角是最小元素min,右下角为最大元素max,相当于框定了一个范围,假定min<mid<max,那么小于或者等于mid的元素肯定在左上方,那么我们依次从矩阵的左下角开始统计有多少个num元素小于或等于mid,当num>=k时,证明mid应该减少,否则mid应该增大,符合二分法的思路。

    代码

    class Solution { public: int check(vector<vector<int>>& matrix, int m, int n, int mid, int k) { int i = m - 1; int j = 0; int num = 0; while(i >= 0 && j < n) { //由有序矩阵的性质,左下角元素是当前列最大,行最小 if(matrix[i][j] <= mid) { num += i + 1; j++; } else { i--; } } return num >= k; } int kthSmallest(vector<vector<int>>& matrix, int k) { int m = matrix.size(); int n = matrix[0].size(); int left = matrix[0][0]; int right = matrix[m - 1][n - 1]; while(left < right) { int mid = left + (right - left) / 2; //统计小于或等于mid的个数 if(check(matrix, m, n, mid, k)) { right = mid; } else { left = mid + 1; } } return left; } };
    Processed: 0.034, SQL: 9